From: Pierre-Marc Fournier Date: Fri, 25 Sep 2009 16:04:45 +0000 (-0400) Subject: libinterfork: disable signals while forking and running ust_fork() X-Git-Tag: v1.9.1~904 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=df793c559d17d5b3c39df6973b2b3d85ed6328b9;p=lttng-ust.git libinterfork: disable signals while forking and running ust_fork() --- diff --git a/libinterfork/interfork.c b/libinterfork/interfork.c index cfdd2c47..26a8bd6a 100644 --- a/libinterfork/interfork.c +++ b/libinterfork/interfork.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "share/usterr.h" extern void ust_fork(void); @@ -30,6 +31,10 @@ pid_t fork(void) pid_t retval; + int result; + sigset_t all_sigs; + sigset_t orig_sigs; + if(plibc_func == NULL) { plibc_func = dlsym(RTLD_NEXT, "fork"); if(plibc_func == NULL) { @@ -38,10 +43,38 @@ pid_t fork(void) } } + /* Disable interrupts. This is to avoid that the child + * intervenes before it is properly setup for tracing. It is + * safer to disable all signals, because then we know we are not + * breaking anything by restoring the original mask. + */ + + /* FIXME: + - only do this if tracing is active + */ + + /* Disable signals */ + sigfillset(&all_sigs); + result = sigprocmask(SIG_BLOCK, &all_sigs, &orig_sigs); + if(result == -1) { + PERROR("sigprocmask"); + return -1; + } + + /* Do the real fork */ retval = plibc_func(); - if(retval == 0) + if(retval == 0) { + /* child */ ust_fork(); + } + + /* Restore signals */ + result = sigprocmask(SIG_BLOCK, &orig_sigs, NULL); + if(result == -1) { + PERROR("sigprocmask"); + return -1; + } return retval; }