diff options
author | Andrew Tridgell <tridge@samba.org> | 1998-09-17 06:36:08 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1998-09-17 06:36:08 +0000 |
commit | e959f2e2322cfac811946d418406267629a2c12b (patch) | |
tree | 84205289f154795242b9bf47420c6c848c450cd0 | |
parent | 20d3988e06c0b8eab7a63ece62c538e8eeee130e (diff) | |
download | samba-e959f2e2322cfac811946d418406267629a2c12b.tar.gz samba-e959f2e2322cfac811946d418406267629a2c12b.tar.bz2 samba-e959f2e2322cfac811946d418406267629a2c12b.zip |
fixed a potential problem with wins_write_database() child processes.
In sig_term() we were calling wins_write_database(0) which would fork a
child. This child might then get killed by the same process killing
off the parent. That process would then fork another child etc.
The solution is to pass a "background" flag to wins_write_database(0)
and only fork if this is set.
(This used to be commit 1e1a512e3ff59f962fb3de382f671618bed60839)
-rw-r--r-- | source3/include/proto.h | 7 | ||||
-rw-r--r-- | source3/nmbd/nmbd.c | 2 | ||||
-rw-r--r-- | source3/nmbd/nmbd_serverlistdb.c | 3 | ||||
-rw-r--r-- | source3/nmbd/nmbd_winsserver.c | 21 |
4 files changed, 14 insertions, 19 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index a864cd7033..f2b74b4076 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -825,7 +825,7 @@ void wins_process_name_query_request(struct subnet_record *subrec, void wins_process_name_release_request(struct subnet_record *subrec, struct packet_struct *p); void initiate_wins_processing(time_t t); -void wins_write_database(void); +void wins_write_database(BOOL background); /*The following definitions come from nmbd/nmbd_workgroupdb.c */ @@ -1744,11 +1744,6 @@ void file_chain_reset(void); void file_chain_save(void); void file_chain_restore(void); -/*The following definitions come from smbd/groupname.c */ - -void load_groupname_map(void); -void map_gid_to_sid( gid_t gid, DOM_SID *psid); - /*The following definitions come from smbd/ipc.c */ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int bufsize); diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index 482e136ba4..d7383fb736 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -68,7 +68,7 @@ static void sig_term(int sig) DEBUG(0,("Got SIGTERM: going down...\n")); /* Write out wins.dat file if samba is a WINS server */ - wins_write_database(); + wins_write_database(False); /* Remove all SELF registered names. */ release_my_names(); diff --git a/source3/nmbd/nmbd_serverlistdb.c b/source3/nmbd/nmbd_serverlistdb.c index a4dab6f419..458fbd0085 100644 --- a/source3/nmbd/nmbd_serverlistdb.c +++ b/source3/nmbd/nmbd_serverlistdb.c @@ -321,6 +321,8 @@ void write_browse_list(time_t t, BOOL force_write) return; } + lasttime = t; + dump_workgroups(force_write); for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec)) @@ -335,7 +337,6 @@ void write_browse_list(time_t t, BOOL force_write) if(!list_changed) return; - lasttime = t; updatecount++; pstrcpy(fname,lp_lockdir()); diff --git a/source3/nmbd/nmbd_winsserver.c b/source3/nmbd/nmbd_winsserver.c index 1502dd8155..3c831ee1ea 100644 --- a/source3/nmbd/nmbd_winsserver.c +++ b/source3/nmbd/nmbd_winsserver.c @@ -1535,7 +1535,7 @@ void initiate_wins_processing(time_t t) expire_names_on_subnet(wins_server_subnet, t); if(wins_server_subnet->namelist_changed) - wins_write_database(); + wins_write_database(True); wins_server_subnet->namelist_changed = False; } @@ -1543,7 +1543,7 @@ void initiate_wins_processing(time_t t) /******************************************************************* Write out the current WINS database. ******************************************************************/ -void wins_write_database(void) +void wins_write_database(BOOL background) { struct name_record *namerec; pstring fname, fnamenew; @@ -1556,16 +1556,15 @@ void wins_write_database(void) /* we will do the writing in a child process to ensure that the parent doesn't block while this is done */ - if ((child_pid=fork())) { - return; + if (background) { + CatchChild(); + if ((child_pid=fork())) { + return; + } } - pstrcpy(fname,lp_lockdir()); - trim_string(fname,NULL,"/"); - pstrcat(fname,"/"); - pstrcat(fname,WINS_LIST); - pstrcpy(fnamenew,fname); - pstrcat(fnamenew,"."); + slprintf(fname,sizeof(fname),"%s/%s.%d", lp_lockdir(), WINS_LIST, getpid()); + string_sub(s->fname,"//", "/"); if((fp = fopen(fnamenew,"w")) == NULL) { @@ -1612,7 +1611,7 @@ void wins_write_database(void) } fclose(fp); - unlink(fname); chmod(fnamenew,0644); + unlink(fname); rename(fnamenew,fname); } |