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 <walters@verbum.org>
This commit is contained in:
Kurt Miller 2009-07-10 19:14:10 -04:00 committed by Colin Walters
parent 3f07008823
commit 644fc38b24

View 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