From 76f9e57d909a53d30a4f8fe5e924683fa9b7c0d5 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 9 Feb 2013 19:29:14 +0100 Subject: [PATCH] signal: Restore errno on exit from signal handler. This probably is not necessary since generic_signal_handler() calls exit(3) if the write to the signal pipe fails. However, nobody is going to stop write(2) from setting errno also on success, so let's play safe and always restore its value on exit. --- signal.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/signal.c b/signal.c index b2317c9b..b8f3bbbc 100644 --- a/signal.c +++ b/signal.c @@ -51,15 +51,22 @@ err_out: exit(EXIT_FAILURE); } -/* - * just write one integer to signal pipe - */ +/* Write the signal number to signal pipe. */ static void generic_signal_handler(int s) { + /* + * Signal handlers that make system calls must save a copy of errno on + * entry to the handler and restore it on exit, to prevent the + * possibility of overwriting a errno value that had previously been + * set in the main program. + */ + int save_errno = errno; ssize_t ret = write(signal_pipe[1], &s, sizeof(int)); - if (ret == sizeof(int)) + if (ret == sizeof(int)) { + errno = save_errno; return; + } if (ret < 0) PARA_EMERG_LOG("%s\n", strerror(errno)); else -- 2.39.5