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>
Fri, 10 Jul 2009 23:19:28 +0000 (19:19 -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>
dbus/dbus-sysdeps-unix.c

index 29d234a..5221a1a 100644 (file)
@@ -2866,6 +2866,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;
@@ -2875,6 +2876,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))
     {
@@ -2969,6 +2978,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 */
@@ -3027,6 +3038,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