From boyang - ensure we never "return" from a forked child, always _exit().
[jra/samba/.git] / source3 / winbindd / winbindd_cm.c
index 8aaa85020142fba5379402bbbba01fcd5f541bfd..962b6e6d1b7257c768fb40fafaf5beec18cee5e6 100644 (file)
@@ -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,27 +213,22 @@ 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"));
+                       _exit(1);
+               }
+       }
+
+       if (!winbindd_reinit_after_fork(lfile)) {
                messaging_send_buf(winbind_messaging_context(),
                                   pid_to_procid(parent_pid),
                                   MSG_WINBIND_FAILED_TO_GO_ONLINE,
                                   (uint8 *)domain->name,
                                   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();
-               }
+               _exit(1);
        }
+       SAFE_FREE(lfile);
 
        mem_ctx = talloc_init("fork_child_dc_connect");
        if (!mem_ctx) {
@@ -242,7 +238,7 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain)
                                   MSG_WINBIND_FAILED_TO_GO_ONLINE,
                                   (uint8 *)domain->name,
                                   strlen(domain->name)+1);
-               _exit(0);
+               _exit(1);
        }
 
        if ((!get_dcs(mem_ctx, domain, &dcs, &num_dcs)) || (num_dcs == 0)) {
@@ -272,7 +268,7 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain)
 
 static void check_domain_online_handler(struct event_context *ctx,
                                        struct timed_event *te,
-                                       const struct timeval *now,
+                                       struct timeval now,
                                        void *private_data)
 {
         struct winbindd_domain *domain =
@@ -286,7 +282,7 @@ static void check_domain_online_handler(struct event_context *ctx,
 
        /* Are we still in "startup" mode ? */
 
-       if (domain->startup && (now->tv_sec > domain->startup_time + 30)) {
+       if (domain->startup && (now.tv_sec > domain->startup_time + 30)) {
                /* No longer in "startup" mode. */
                DEBUG(10,("check_domain_online_handler: domain %s no longer in 'startup' mode.\n",
                        domain->name ));
@@ -367,7 +363,6 @@ void set_domain_offline(struct winbindd_domain *domain)
        domain->check_online_event = event_add_timed(winbind_event_context(),
                                                NULL,
                                                timeval_current_ofs(domain->check_online_timeout,0),
-                                               "check_domain_online_handler",
                                                check_domain_online_handler,
                                                domain);
 
@@ -403,8 +398,6 @@ void set_domain_offline(struct winbindd_domain *domain)
 
 static void set_domain_online(struct winbindd_domain *domain)
 {
-       struct timeval now;
-
        DEBUG(10,("set_domain_online: called for domain %s\n",
                domain->name ));
 
@@ -423,11 +416,7 @@ static void set_domain_online(struct winbindd_domain *domain)
        winbindd_set_locator_kdc_envs(domain);
 
        /* If we are waiting to get a krb5 ticket, trigger immediately. */
-       GetTimeOfDay(&now);
-       set_event_dispatch_time(winbind_event_context(),
-                               "krb5_ticket_gain_handler", now);
-       set_event_dispatch_time(winbind_event_context(),
-                               "krb5_ticket_refresh_handler", now);
+       ccache_regain_all_now();
 
        /* Ok, we're out of any startup mode now... */
        domain->startup = False;
@@ -524,7 +513,6 @@ void set_domain_online_request(struct winbindd_domain *domain)
        domain->check_online_event = event_add_timed(winbind_event_context(),
                                                     NULL,
                                                     tev,
-                                                    "check_domain_online_handler",
                                                     check_domain_online_handler,
                                                     domain);