Sfoglia il codice sorgente

make sure to block all signals when calling daemon() to prevent delivery while the parent is sharing the stack

Mike Frysinger 17 anni fa
parent
commit
d83d5f98e1
1 ha cambiato i file con 13 aggiunte e 1 eliminazioni
  1. 13 1
      libc/unistd/daemon.c

+ 13 - 1
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)
 {