From d83d5f98e1c6be6d363abf208d7f304fc356a285 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 13 Apr 2009 00:06:40 +0000 Subject: make sure to block all signals when calling daemon() to prevent delivery while the parent is sharing the stack --- libc/unistd/daemon.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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 #include #include +#include #include #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) { -- cgit v1.2.3