Преглед на файлове

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

Mike Frysinger преди 16 години
родител
ревизия
d83d5f98e1
променени са 1 файла, в които са добавени 13 реда и са изтрити 1 реда
  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)
 {