diff options
author | Mike Frysinger <vapier@gentoo.org> | 2009-04-13 00:06:40 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2009-04-13 00:06:40 +0000 |
commit | d83d5f98e1c6be6d363abf208d7f304fc356a285 (patch) | |
tree | 72b699908c9cb9e633eae9f49bff8a5d644abb52 /libc/unistd/daemon.c | |
parent | 35b1cd3d25d1d4f6e8fc0a90263b5d98dfa66073 (diff) |
make sure to block all signals when calling daemon() to prevent delivery while the parent is sharing the stack
Diffstat (limited to 'libc/unistd/daemon.c')
-rw-r--r-- | libc/unistd/daemon.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/libc/unistd/daemon.c b/libc/unistd/daemon.c index 19332cca1..789488967 100644 --- a/libc/unistd/daemon.c +++ b/libc/unistd/daemon.c @@ -44,6 +44,7 @@ #include <features.h> #include <fcntl.h> #include <paths.h> +#include <signal.h> #include <unistd.h> #if defined __USE_BSD || (defined __USE_XOPEN && !defined __USE_UNIX98) @@ -61,7 +62,7 @@ /* use clone() to get fork() like behavior here -- we just want to disassociate * from the controlling terminal */ -static inline pid_t fork_parent(void) +static inline pid_t _fork_parent(void) { register unsigned long ret = INTERNAL_SYSCALL(clone, wtf, 2, CLONE_VM, 0); if (ret != -1 && ret != 0) @@ -69,6 +70,17 @@ static inline pid_t fork_parent(void) INTERNAL_SYSCALL(exit, wtf, 0); return ret; } +static inline pid_t fork_parent(void) +{ + /* Block all signals to keep the parent from using the stack */ + pid_t ret; + sigset_t new_set, old_set; + sigfillset(&new_set); + sigprocmask(SIG_BLOCK, &new_set, &old_set); + ret = _fork_parent(); + sigprocmask(SIG_SETMASK, &old_set, NULL); + return ret; +} #else static inline pid_t fork_parent(void) { |