The branch, master has been updated
       via  6d6117b s4: process_standard: Add a simplified SIGTERM handler 
based on code from source4/smbd/server.c. Use from a tevent handler added to 
standard_accept_connection() and standard_new_task()
       via  d354be9 s4: process_standard: Add tevent SIGHUP signal handler to 
standard_accept_connection() and standard_new_task().
       via  513eb8b s4: process_standard: Add return checking for 
tevent_add_fd() to standard_accept_connection() and standard_new_task().
       via  c977143 s4: process_standard: Always free tevent_context before 
exit().
       via  7c01723 s4: process_standard: Move talloc_free of event context so 
it is last thing freed before exit().
      from  a9bd9a1 s3:tests: Create a test directory for a clean test

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6d6117b5ba510d169cbc0c285edc75c24f60625a
Author: Jeremy Allison <[email protected]>
Date:   Fri Apr 7 15:45:41 2017 -0700

    s4: process_standard: Add a simplified SIGTERM handler based on code from 
source4/smbd/server.c. Use from a tevent handler added to 
standard_accept_connection() and standard_new_task()
    
    Allows us to be independent of parent SIGTERM signal handling.
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Ralph Boehme <[email protected]>
    
    Autobuild-User(master): Ralph Böhme <[email protected]>
    Autobuild-Date(master): Sat Apr  8 16:21:57 CEST 2017 on sn-devel-144

commit d354be9e078730505462623225295e675d73fd86
Author: Jeremy Allison <[email protected]>
Date:   Fri Apr 7 15:31:57 2017 -0700

    s4: process_standard: Add tevent SIGHUP signal handler to 
standard_accept_connection() and standard_new_task().
    
    This makes us independent of parent SIGHUP signal handling.
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Ralph Boehme <[email protected]>

commit 513eb8b8d397a9d6a5b7f029590b2e7dc0c1b743
Author: Jeremy Allison <[email protected]>
Date:   Fri Apr 7 15:12:51 2017 -0700

    s4: process_standard: Add return checking for tevent_add_fd() to 
standard_accept_connection() and standard_new_task().
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Ralph Boehme <[email protected]>

commit c97714319bdd0c3d54fb3ba64798c3aa674bb60b
Author: Jeremy Allison <[email protected]>
Date:   Fri Apr 7 15:10:09 2017 -0700

    s4: process_standard: Always free tevent_context before exit().
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Ralph Boehme <[email protected]>

commit 7c017234ab486859829aeaab2ce728956db30b60
Author: Jeremy Allison <[email protected]>
Date:   Fri Apr 7 15:08:13 2017 -0700

    s4: process_standard: Move talloc_free of event context so it is last thing 
freed before exit().
    
    Signed-off-by: Jeremy Allison <[email protected]>
    Reviewed-by: Ralph Boehme <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 source4/smbd/process_standard.c | 90 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 86 insertions(+), 4 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/smbd/process_standard.c b/source4/smbd/process_standard.c
index ca93f93..92f07ad 100644
--- a/source4/smbd/process_standard.c
+++ b/source4/smbd/process_standard.c
@@ -29,6 +29,7 @@
 #include "param/param.h"
 #include "ldb_wrap.h"
 #include "lib/messaging/messaging.h"
+#include "lib/util/debug.h"
 
 struct standard_child_state {
        const char *name;
@@ -58,6 +59,34 @@ static void standard_model_init(void)
        }
 }
 
+static void sighup_signal_handler(struct tevent_context *ev,
+                               struct tevent_signal *se,
+                               int signum, int count, void *siginfo,
+                               void *private_data)
+{
+       debug_schedule_reopen_logs();
+}
+
+static void sigterm_signal_handler(struct tevent_context *ev,
+                               struct tevent_signal *se,
+                               int signum, int count, void *siginfo,
+                               void *private_data)
+{
+#if HAVE_GETPGRP
+       if (getpgrp() == getpid()) {
+               /*
+                * We're the process group leader, send
+                * SIGTERM to our process group.
+                */
+               DEBUG(0,("SIGTERM: killing children\n"));
+               kill(-getpgrp(), SIGTERM);
+       }
+#endif
+       DEBUG(0,("Exiting pid %u on SIGTERM\n", (unsigned int)getpid()));
+       talloc_free(ev);
+       exit(127);
+}
+
 /*
   handle EOF on the parent-to-all-children pipe in the child
 */
@@ -65,6 +94,7 @@ static void standard_pipe_handler(struct tevent_context 
*event_ctx, struct teven
                                  uint16_t flags, void *private_data)
 {
        DEBUG(10,("Child %d exiting\n", (int)getpid()));
+       talloc_free(event_ctx);
        exit(0);
 }
 
@@ -211,6 +241,8 @@ static void standard_accept_connection(struct 
tevent_context *ev,
        pid_t pid;
        struct socket_address *c, *s;
        struct standard_child_state *state;
+       struct tevent_fd *fde = NULL;
+       struct tevent_signal *se = NULL;
 
        state = setup_standard_child_pipe(ev, NULL);
        if (state == NULL) {
@@ -277,13 +309,37 @@ static void standard_accept_connection(struct 
tevent_context *ev,
                smb_panic("Failed to re-initialise imessaging after fork");
        }
 
-       tevent_add_fd(ev, ev, child_pipe[0], TEVENT_FD_READ,
+       fde = tevent_add_fd(ev, ev, child_pipe[0], TEVENT_FD_READ,
                      standard_pipe_handler, NULL);
+       if (fde == NULL) {
+               smb_panic("Failed to add fd handler after fork");
+       }
+
        if (child_pipe[1] != -1) {
                close(child_pipe[1]);
                child_pipe[1] = -1;
        }
 
+       se = tevent_add_signal(ev,
+                               ev,
+                               SIGHUP,
+                               0,
+                               sighup_signal_handler,
+                               NULL);
+       if (se == NULL) {
+               smb_panic("Failed to add SIGHUP handler after fork");
+       }
+
+       se = tevent_add_signal(ev,
+                               ev,
+                               SIGTERM,
+                               0,
+                               sigterm_signal_handler,
+                               NULL);
+       if (se == NULL) {
+               smb_panic("Failed to add SIGTERM handler after fork");
+       }
+
        /* setup the process title */
        c = socket_get_peer_addr(sock2, ev);
        s = socket_get_my_addr(sock2, ev);
@@ -318,6 +374,8 @@ static void standard_new_task(struct tevent_context *ev,
        pid_t pid;
        NTSTATUS status;
        struct standard_child_state *state;
+       struct tevent_fd *fde = NULL;
+       struct tevent_signal *se = NULL;
 
        state = setup_standard_child_pipe(ev, service_name);
        if (state == NULL) {
@@ -360,13 +418,36 @@ static void standard_new_task(struct tevent_context *ev,
                smb_panic("Failed to re-initialise imessaging after fork");
        }
 
-       tevent_add_fd(ev, ev, child_pipe[0], TEVENT_FD_READ,
+       fde = tevent_add_fd(ev, ev, child_pipe[0], TEVENT_FD_READ,
                      standard_pipe_handler, NULL);
+       if (fde == NULL) {
+               smb_panic("Failed to add fd handler after fork");
+       }
        if (child_pipe[1] != -1) {
                close(child_pipe[1]);
                child_pipe[1] = -1;
        }
 
+       se = tevent_add_signal(ev,
+                               ev,
+                               SIGHUP,
+                               0,
+                               sighup_signal_handler,
+                               NULL);
+       if (se == NULL) {
+               smb_panic("Failed to add SIGHUP handler after fork");
+       }
+
+       se = tevent_add_signal(ev,
+                               ev,
+                               SIGTERM,
+                               0,
+                               sigterm_signal_handler,
+                               NULL);
+       if (se == NULL) {
+               smb_panic("Failed to add SIGTERM handler after fork");
+       }
+
        setproctitle("task %s server_id[%d]", service_name, (int)pid);
 
        /* setup this new task.  Cluster ID is PID based for this process model 
*/
@@ -388,12 +469,13 @@ _NORETURN_ static void standard_terminate(struct 
tevent_context *ev, struct load
 {
        DEBUG(2,("standard_terminate: reason[%s]\n",reason));
 
-       talloc_free(ev);
-
        /* this reload_charcnv() has the effect of freeing the iconv context 
memory,
           which makes leak checking easier */
        reload_charcnv(lp_ctx);
 
+       /* Always free event context last before exit. */
+       talloc_free(ev);
+
        /* terminate this process */
        exit(0);
 }


-- 
Samba Shared Repository

Reply via email to