From 644fc38b249b490981becda4b2de5261865bba23 Mon Sep 17 00:00:00 2001 From: Kurt Miller Date: Fri, 10 Jul 2009 19:14:10 -0400 Subject: Bug 21347 - Don't fail autolaunching if process has SIGCHLD handler 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 --- dbus/dbus-sysdeps-unix.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'dbus') diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c index 29d234a4..5221a1a8 100644 --- a/dbus/dbus-sysdeps-unix.c +++ b/dbus/dbus-sysdeps-unix.c @@ -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 -- cgit