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 /source3/nmbd | |
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)
Diffstat (limited to 'source3/nmbd')
-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 |
3 files changed, 13 insertions, 13 deletions
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); } |