mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-03-17 18:20:35 +01:00
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:
parent
3f07008823
commit
644fc38b24
1 changed files with 13 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue