diff --git a/bus/main.c b/bus/main.c index 0ede03f7..b3fcddd0 100644 --- a/bus/main.c +++ b/bus/main.c @@ -67,6 +67,10 @@ typedef enum static void signal_handler (int sig) { + /* Signal handlers that might set errno must save and restore the errno + * that the interrupted function might have been relying on. */ + int saved_errno = errno; + switch (sig) { case SIGHUP: @@ -134,6 +138,8 @@ signal_handler (int sig) * signal, but keep -Wswitch-default happy */ break; } + + errno = saved_errno; } #endif /* DBUS_UNIX */ diff --git a/dbus/dbus-spawn.c b/dbus/dbus-spawn.c index 3c721d6f..8ab529a4 100644 --- a/dbus/dbus-spawn.c +++ b/dbus/dbus-spawn.c @@ -1138,11 +1138,17 @@ static int babysit_sigchld_pipe = -1; static void babysit_signal_handler (int signo) { + /* Signal handlers that might set errno must save and restore the errno + * that the interrupted function might have been relying on. */ + int saved_errno = errno; char b = '\0'; + again: if (write (babysit_sigchld_pipe, &b, 1) <= 0) if (errno == EINTR) goto again; + + errno = saved_errno; } static void babysit (pid_t grandchild_pid,