diff --git a/source/winbindd/winbindd.c b/source/winbindd/winbindd.c index 57eee20..c017916 100644 --- a/source/winbindd/winbindd.c +++ b/source/winbindd/winbindd.c @@ -131,15 +131,20 @@ static void flush_caches(void) /* Handle the signal by unlinking socket and exiting */ -static void terminate(void) +static void terminate(bool is_parent) { - char *path = NULL; - - /* Remove socket file */ - if (asprintf(&path, "%s/%s", + if (is_parent) { + /* When parent goes away we should + * remove the socket file. Not so + * when children terminate. + */ + char *path = NULL; + + if (asprintf(&path, "%s/%s", get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME) > 0) { - unlink(path); - SAFE_FREE(path); + unlink(path); + SAFE_FREE(path); + } } idmap_close(); @@ -810,10 +815,10 @@ void winbind_check_sighup(void) } /* check if TERM has been received */ -void winbind_check_sigterm(void) +void winbind_check_sigterm(bool is_parent) { if (do_sigterm) - terminate(); + terminate(is_parent); } /* Process incoming clients on listen_sock. We use a tricky non-blocking, @@ -975,7 +980,7 @@ static void process_loop(void) /* Check signal handling things */ - winbind_check_sigterm(); + winbind_check_sigterm(true); winbind_check_sighup(); if (do_sigusr2) { diff --git a/source/winbindd/winbindd_dual.c b/source/winbindd/winbindd_dual.c index d465801..81d67f6 100644 --- a/source/winbindd/winbindd_dual.c +++ b/source/winbindd/winbindd_dual.c @@ -1106,7 +1106,7 @@ static bool fork_domain_child(struct winbindd_child *child) TALLOC_CTX *frame = talloc_stackframe(); /* check for signals */ - winbind_check_sigterm(); + winbind_check_sigterm(false); winbind_check_sighup(); run_events(winbind_event_context(), 0, NULL, NULL);