diff options
author | Andrew Bartlett <abartlet@samba.org> | 2010-05-14 21:51:48 +1000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2010-05-14 23:25:45 +1000 |
commit | ad197f6f15054e398c0bf4f27388a86a384c09ba (patch) | |
tree | 355976df9639247957f8fa89dd640e6f29ff59ec /source4/smbd/process_onefork.c | |
parent | 6f859f58afff10f708bf06d55d1cfab575875627 (diff) | |
download | samba-ad197f6f15054e398c0bf4f27388a86a384c09ba.tar.gz samba-ad197f6f15054e398c0bf4f27388a86a384c09ba.tar.bz2 samba-ad197f6f15054e398c0bf4f27388a86a384c09ba.zip |
s4:process_model Fix process_standard and process_onefork not to use
multiple event contexts
It is NEVER valid to free an event context that anybody else may have
a reference to, and never normally valid to have two 'live' at once.
We must instead call tevent_re_initialise() to wipe clean an existing
pointer.
Andrew Bartlett
Diffstat (limited to 'source4/smbd/process_onefork.c')
-rw-r--r-- | source4/smbd/process_onefork.c | 26 |
1 files changed, 6 insertions, 20 deletions
diff --git a/source4/smbd/process_onefork.c b/source4/smbd/process_onefork.c index 45e461327c..d1688ec98a 100644 --- a/source4/smbd/process_onefork.c +++ b/source4/smbd/process_onefork.c @@ -98,9 +98,6 @@ static void onefork_new_task(struct tevent_context *ev, void *private_data) { pid_t pid; - int i, num_children; - - struct tevent_context *ev2, *ev_parent; pid = fork(); @@ -111,31 +108,20 @@ static void onefork_new_task(struct tevent_context *ev, pid = getpid(); - /* This is now the child code. We need a completely new event_context to work with */ - ev2 = s4_event_context_init(NULL); - - /* setup this as the default context */ - s4_event_context_set_default(ev2); - - /* the service has given us a private pointer that - encapsulates the context it needs for this new connection - - everything else will be freed */ - talloc_steal(ev2, private_data); - - /* this will free all the listening sockets and all state that - is not associated with this new connection */ - talloc_free(ev); + if (tevent_re_initialise(ev) != 0) { + smb_panic("Failed to re-initialise tevent after fork"); + } setproctitle("task %s server_id[%d]", service_name, pid); onefork_reload_after_fork(); /* setup this new connection: process will bind to it's sockets etc */ - new_task_fn(ev2, lp_ctx, cluster_id(pid, 0), private_data); + new_task_fn(ev, lp_ctx, cluster_id(pid, 0), private_data); - event_loop_wait(ev2); + event_loop_wait(ev); - talloc_free(ev2); + talloc_free(ev); exit(0); } |