[prev in list] [next in list] [prev in thread] [next in thread] 

List:       uclibc-cvs
Subject:    svn commit: [26078] trunk/uClibc/libc/unistd
From:       vapier () uclibc ! org (vapier at uclibc ! org)
Date:       2009-04-13 0:06:40
Message-ID: 20090413000640.E9E0C76474 () busybox ! osuosl ! org
[Download RAW message or body]

Author: vapier
Date: 2009-04-13 00:06:40 +0000 (Mon, 13 Apr 2009)
New Revision: 26078

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

Modified:
   trunk/uClibc/libc/unistd/daemon.c


Changeset:
Modified: trunk/uClibc/libc/unistd/daemon.c
===================================================================
--- trunk/uClibc/libc/unistd/daemon.c	2009-04-12 20:35:19 UTC (rev 26077)
+++ trunk/uClibc/libc/unistd/daemon.c	2009-04-13 00:06:40 UTC (rev 26078)
@@ -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 @@
 		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)
 {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic