Bug 21347 - Don't fail autolaunching if process has SIGCHLD handler
authorKurt Miller <kurt@intricatesoftware.com>
Fri, 10 Jul 2009 23:14:10 +0000 (19:14 -0400)
committerColin Walters <walters@verbum.org>
Tue, 14 Jul 2009 19:39:26 +0000 (15:39 -0400)
If other code in the process set a global SIGCHLD handler, it
will make autolaunching fail spuriously due to waitpid() failing.

This fix will temporarily block SIGCHLD delivery.

Signed-off-by: Colin Walters <walters@verbum.org>
(cherry picked from commit 644fc38b249b490981becda4b2de5261865bba23)

dbus/dbus-sysdeps-unix.c

index ccb8483..28710f4 100644 (file)
@@ -2860,6 +2860,7 @@ _dbus_get_autolaunch_address (DBusString *address,
   int i;
   DBusString uuid;
   dbus_bool_t retval;
+  sigset_t new_set, old_set;
   
   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   retval = FALSE;
@@ -2869,6 +2870,14 @@ _dbus_get_autolaunch_address (DBusString *address,
       _DBUS_SET_OOM (error);
       return FALSE;
     }
+
+  /* We need to block any existing handlers for SIGCHLD temporarily; they
+   * will cause waitpid() below to fail.
+   * https://bugs.freedesktop.org/show_bug.cgi?id=21347
+   */
+  sigemptyset (&new_set);
+  sigaddset (&new_set, SIGCHLD);
+  sigprocmask (SIG_BLOCK, &new_set, &old_set);
   
   if (!_dbus_get_local_machine_uuid_encoded (&uuid))
     {
@@ -2963,6 +2972,8 @@ _dbus_get_autolaunch_address (DBusString *address,
       for (i = 3; i < maxfds; i++)
         close (i);
 
+      sigprocmask(SIG_SETMASK, &old_set, NULL);
+
       execv (DBUS_BINDIR "/dbus-launch", argv);
 
       /* failed, try searching PATH */
@@ -3021,6 +3032,8 @@ _dbus_get_autolaunch_address (DBusString *address,
   retval = TRUE;
   
  out:
+  sigprocmask (SIG_SETMASK, &old_set, NULL);
+
   if (retval)
     _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   else