Zbigniew Jędrzejewski-Szmek 62fe94
From 24a5d6b04e17d447cf122f02a8a2dedd843cce45 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: Lennart Poettering <lennart@poettering.net>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Tue, 26 Aug 2014 21:03:20 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] util: make sure reset_all_signal_handlers() continues with
Zbigniew Jędrzejewski-Szmek 62fe94
 all other signal handlers when one sigaction() fails
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
After all, we usually don't check for failures here, and it is better to
Zbigniew Jędrzejewski-Szmek 62fe94
do as much as we can...
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/shared/util.c | 9 +++++----
Zbigniew Jędrzejewski-Szmek 62fe94
 1 file changed, 5 insertions(+), 4 deletions(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/shared/util.c b/src/shared/util.c
Zbigniew Jędrzejewski-Szmek 62fe94
index fc6f668726..4af2d3ceba 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/shared/util.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/shared/util.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -937,7 +937,7 @@ int readlink_and_canonicalize(const char *p, char **r) {
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 int reset_all_signal_handlers(void) {
Zbigniew Jędrzejewski-Szmek 62fe94
-        int sig;
Zbigniew Jędrzejewski-Szmek 62fe94
+        int sig, r = 0;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         for (sig = 1; sig < _NSIG; sig++) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 struct sigaction sa = {
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -945,17 +945,18 @@ int reset_all_signal_handlers(void) {
Zbigniew Jędrzejewski-Szmek 62fe94
                         .sa_flags = SA_RESTART,
Zbigniew Jędrzejewski-Szmek 62fe94
                 };
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+                /* These two cannot be caught... */
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (sig == SIGKILL || sig == SIGSTOP)
Zbigniew Jędrzejewski-Szmek 62fe94
                         continue;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 /* On Linux the first two RT signals are reserved by
Zbigniew Jędrzejewski-Szmek 62fe94
                  * glibc, and sigaction() will return EINVAL for them. */
Zbigniew Jędrzejewski-Szmek 62fe94
                 if ((sigaction(sig, &sa, NULL) < 0))
Zbigniew Jędrzejewski-Szmek 62fe94
-                        if (errno != EINVAL)
Zbigniew Jędrzejewski-Szmek 62fe94
-                                return -errno;
Zbigniew Jędrzejewski-Szmek 62fe94
+                        if (errno != EINVAL && r == 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                                r = -errno;
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
+        return r;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 char *strstrip(char *s) {