diff options
Diffstat (limited to 'source3/winbindd')
-rw-r--r-- | source3/winbindd/winbindd.c | 5 | ||||
-rw-r--r-- | source3/winbindd/winbindd_cm.c | 24 | ||||
-rw-r--r-- | source3/winbindd/winbindd_dual.c | 38 | ||||
-rw-r--r-- | source3/winbindd/winbindd_proto.h | 1 |
4 files changed, 37 insertions, 31 deletions
diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index cf1dbf6f72..8f94f8ad70 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -1200,6 +1200,11 @@ int main(int argc, char **argv, char **envp) TimeInit(); + /* Don't use winbindd_reinit_after_fork here as + * we're just starting up and haven't created any + * winbindd-specific resources we must free yet. JRA. + */ + if (!reinit_after_fork(winbind_messaging_context(), winbind_event_context(), false)) { DEBUG(0,("reinit_after_fork() failed\n")); diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index e5e3565604..4e5659d903 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -172,6 +172,7 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain) int num_dcs = 0; TALLOC_CTX *mem_ctx = NULL; pid_t parent_pid = sys_getpid(); + char *lfile = NULL; /* Stop zombies */ CatchChild(); @@ -212,9 +213,14 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain) /* Leave messages blocked - we will never process one. */ - if (!reinit_after_fork(winbind_messaging_context(), - winbind_event_context(), true)) { - DEBUG(0,("reinit_after_fork() failed\n")); + if (!override_logfile) { + if (asprintf(&lfile, "%s/log.winbindd-dc-connect", get_dyn_LOGFILEBASE()) == -1) { + DEBUG(0, ("fork_child_dc_connect: out of memory.\n")); + return false; + } + } + + if (!winbindd_reinit_after_fork(lfile)) { messaging_send_buf(winbind_messaging_context(), pid_to_procid(parent_pid), MSG_WINBIND_FAILED_TO_GO_ONLINE, @@ -222,17 +228,7 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain) strlen(domain->name)+1); _exit(0); } - - close_conns_after_fork(); - - if (!override_logfile) { - char *lfile; - if (asprintf(&lfile, "%s/log.winbindd-dc-connect", get_dyn_LOGFILEBASE()) > 0) { - lp_set_logfile(lfile); - SAFE_FREE(lfile); - reopen_logs(); - } - } + SAFE_FREE(lfile); mem_ctx = talloc_init("fork_child_dc_connect"); if (!mem_ctx) { diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index d2c085a9d1..c1b1efb9f2 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1142,7 +1142,7 @@ static void child_msg_dump_event_list(struct messaging_context *msg, dump_event_list(winbind_event_context()); } -static void winbindd_reinit_after_fork(struct winbindd_child *child) +bool winbindd_reinit_after_fork(const char *logfilename) { struct winbindd_domain *domain; struct winbindd_child *cl; @@ -1150,13 +1150,13 @@ static void winbindd_reinit_after_fork(struct winbindd_child *child) if (!reinit_after_fork(winbind_messaging_context(), winbind_event_context(), true)) { DEBUG(0,("reinit_after_fork() failed\n")); - _exit(0); + return false; } close_conns_after_fork(); - if (!override_logfile) { - lp_set_logfile(child->logfilename); + if (!override_logfile && logfilename) { + lp_set_logfile(logfilename); reopen_logs(); } @@ -1178,18 +1178,6 @@ static void winbindd_reinit_after_fork(struct winbindd_child *child) messaging_deregister(winbind_messaging_context(), MSG_DEBUG, NULL); - /* Handle online/offline messages. */ - messaging_register(winbind_messaging_context(), NULL, - MSG_WINBIND_OFFLINE, child_msg_offline); - messaging_register(winbind_messaging_context(), NULL, - MSG_WINBIND_ONLINE, child_msg_online); - messaging_register(winbind_messaging_context(), NULL, - MSG_WINBIND_ONLINESTATUS, child_msg_onlinestatus); - messaging_register(winbind_messaging_context(), NULL, - MSG_DUMP_EVENT_LIST, child_msg_dump_event_list); - messaging_register(winbind_messaging_context(), NULL, - MSG_DEBUG, debug_message); - /* We have destroyed all events in the winbindd_event_context * in reinit_after_fork(), so clean out all possible pending * event pointers. */ @@ -1215,6 +1203,8 @@ static void winbindd_reinit_after_fork(struct winbindd_child *child) TALLOC_FREE(cl->lockout_policy_event); TALLOC_FREE(cl->machine_password_change_event); } + + return true; } static bool fork_domain_child(struct winbindd_child *child) @@ -1268,7 +1258,21 @@ static bool fork_domain_child(struct winbindd_child *child) state.sock = fdpair[0]; close(fdpair[1]); - winbindd_reinit_after_fork(child); + if (!winbindd_reinit_after_fork(child->logfilename)) { + _exit(0); + } + + /* Handle online/offline messages. */ + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_OFFLINE, child_msg_offline); + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_ONLINE, child_msg_online); + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_ONLINESTATUS, child_msg_onlinestatus); + messaging_register(winbind_messaging_context(), NULL, + MSG_DUMP_EVENT_LIST, child_msg_dump_event_list); + messaging_register(winbind_messaging_context(), NULL, + MSG_DEBUG, debug_message); primary_domain = find_our_domain(); diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h index 32f057ad61..594f8be942 100644 --- a/source3/winbindd/winbindd_proto.h +++ b/source3/winbindd/winbindd_proto.h @@ -350,6 +350,7 @@ void winbind_msg_dump_domain_list(struct messaging_context *msg_ctx, uint32_t msg_type, struct server_id server_id, DATA_BLOB *data); +bool winbindd_reinit_after_fork(const char *logfilename); /* The following definitions come from winbindd/winbindd_group.c */ |