From: Simon McVittie Date: Wed, 4 Sep 2013 16:53:23 +0000 (+0100) Subject: _dbus_babysitter_unref: avoid infinite loop if waitpid() returns EINTR X-Git-Tag: dbus-1.6.18~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fc600b6a8f0dec5642b45c1026dee24c9adb9bc2;p=platform%2Fupstream%2Fdbus.git _dbus_babysitter_unref: avoid infinite loop if waitpid() returns EINTR If waitpid() failed with EINTR, we'd go back for another go, but because ret is nonzero, we'd skip the waitpid() and just keep looping. Also avoid an unnecessary "goto" in favour of a proper loop, to make it more clearly correct. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=68945 Reviewed-by: Colin Walters --- diff --git a/dbus/dbus-spawn.c b/dbus/dbus-spawn.c index ef00801..6e42f55 100644 --- a/dbus/dbus-spawn.c +++ b/dbus/dbus-spawn.c @@ -308,15 +308,18 @@ _dbus_babysitter_unref (DBusBabysitter *sitter) if (ret == 0) kill (sitter->sitter_pid, SIGKILL); - again: if (ret == 0) - ret = waitpid (sitter->sitter_pid, &status, 0); + { + do + { + ret = waitpid (sitter->sitter_pid, &status, 0); + } + while (_DBUS_UNLIKELY (ret < 0 && errno == EINTR)); + } if (ret < 0) { - if (errno == EINTR) - goto again; - else if (errno == ECHILD) + if (errno == ECHILD) _dbus_warn ("Babysitter process not available to be reaped; should not happen\n"); else _dbus_warn ("Unexpected error %d in waitpid() for babysitter: %s\n",