diff options
author | Tobias Brunner <tobias@strongswan.org> | 2015-11-19 11:21:48 +0100 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2015-11-23 11:37:19 +0100 |
commit | 88b85e022a4dde71fa1829ffbf948be2d5d1987f (patch) | |
tree | be5bff68c667c1d0d686808bfcc2962c774c5af3 /src | |
parent | b675909662c20bd5c3eb28707e44f42d4ba60b89 (diff) | |
download | strongswan-88b85e022a4dde71fa1829ffbf948be2d5d1987f.tar.bz2 strongswan-88b85e022a4dde71fa1829ffbf948be2d5d1987f.tar.xz |
sigwaitinfo() may fail with EINTR if interrupted by an unblocked signal not in the set
Fixes #1213.
Diffstat (limited to 'src')
-rw-r--r-- | src/charon-cmd/charon-cmd.c | 9 | ||||
-rw-r--r-- | src/charon-nm/charon-nm.c | 9 | ||||
-rw-r--r-- | src/charon-systemd/charon-systemd.c | 9 | ||||
-rw-r--r-- | src/charon-tkm/src/charon-tkm.c | 9 | ||||
-rw-r--r-- | src/charon/charon.c | 11 | ||||
-rw-r--r-- | src/conftest/conftest.c | 2 | ||||
-rw-r--r-- | src/frontends/osx/charon-xpc/charon-xpc.c | 7 | ||||
-rw-r--r-- | src/libfast/fast_dispatcher.c | 6 | ||||
-rw-r--r-- | src/libstrongswan/utils/utils.c | 5 |
9 files changed, 35 insertions, 32 deletions
diff --git a/src/charon-cmd/charon-cmd.c b/src/charon-cmd/charon-cmd.c index b8f943f51..d3b31cc0d 100644 --- a/src/charon-cmd/charon-cmd.c +++ b/src/charon-cmd/charon-cmd.c @@ -115,6 +115,10 @@ static int run() sig = sigwaitinfo(&set, NULL); if (sig == -1) { + if (errno == EINTR) + { /* ignore signals we didn't wait for */ + continue; + } DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno)); return 1; } @@ -152,11 +156,6 @@ static int run() charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig); return 1; } - default: - { - DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig); - break; - } } } } diff --git a/src/charon-nm/charon-nm.c b/src/charon-nm/charon-nm.c index 1773e7c39..fb090e5d3 100644 --- a/src/charon-nm/charon-nm.c +++ b/src/charon-nm/charon-nm.c @@ -85,6 +85,10 @@ static void run() sig = sigwaitinfo(&set, NULL); if (sig == -1) { + if (errno == EINTR) + { /* ignore signals we didn't wait for */ + continue; + } DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno)); return; } @@ -102,11 +106,6 @@ static void run() charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig); return; } - default: - { - DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig); - break; - } } } } diff --git a/src/charon-systemd/charon-systemd.c b/src/charon-systemd/charon-systemd.c index f302d4527..4286cde82 100644 --- a/src/charon-systemd/charon-systemd.c +++ b/src/charon-systemd/charon-systemd.c @@ -254,6 +254,10 @@ static int run() sig = sigwaitinfo(&set, NULL); if (sig == -1) { + if (errno == EINTR) + { /* ignore signals we didn't wait for */ + continue; + } DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno)); return SS_RC_INITIALIZATION_FAILED; } @@ -265,11 +269,6 @@ static int run() charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig); return 0; } - default: - { - DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig); - break; - } } } } diff --git a/src/charon-tkm/src/charon-tkm.c b/src/charon-tkm/src/charon-tkm.c index 52d82f3ad..3923c8ae6 100644 --- a/src/charon-tkm/src/charon-tkm.c +++ b/src/charon-tkm/src/charon-tkm.c @@ -104,6 +104,10 @@ static void run() sig = sigwaitinfo(&set, NULL); if (sig == -1) { + if (errno == EINTR) + { /* ignore signals we didn't wait for */ + continue; + } DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno)); return; } @@ -121,11 +125,6 @@ static void run() charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig); return; } - default: - { - DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig); - break; - } } } } diff --git a/src/charon/charon.c b/src/charon/charon.c index f03b6e1ba..4c2a9a477 100644 --- a/src/charon/charon.c +++ b/src/charon/charon.c @@ -98,7 +98,7 @@ static void run() { sigset_t set; - /* handle SIGINT, SIGHUP ans SIGTERM in this handler */ + /* handle SIGINT, SIGHUP and SIGTERM in this handler */ sigemptyset(&set); sigaddset(&set, SIGINT); sigaddset(&set, SIGHUP); @@ -112,6 +112,10 @@ static void run() sig = sigwaitinfo(&set, NULL); if (sig == -1) { + if (errno == EINTR) + { /* ignore signals we didn't wait for */ + continue; + } DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno)); return; } @@ -144,11 +148,6 @@ static void run() charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig); return; } - default: - { - DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig); - break; - } } } } diff --git a/src/conftest/conftest.c b/src/conftest/conftest.c index 9348b64e1..edfe0ca35 100644 --- a/src/conftest/conftest.c +++ b/src/conftest/conftest.c @@ -565,7 +565,7 @@ int main(int argc, char *argv[]) sigaddset(&set, SIGTERM); sigprocmask(SIG_BLOCK, &set, NULL); - while ((sig = sigwaitinfo(&set, NULL)) != -1) + while ((sig = sigwaitinfo(&set, NULL)) != -1 || errno == EINTR) { switch (sig) { diff --git a/src/frontends/osx/charon-xpc/charon-xpc.c b/src/frontends/osx/charon-xpc/charon-xpc.c index 5b8f98e25..0d8f0f455 100644 --- a/src/frontends/osx/charon-xpc/charon-xpc.c +++ b/src/frontends/osx/charon-xpc/charon-xpc.c @@ -88,6 +88,10 @@ static int run() sig = sigwaitinfo(&set, NULL); if (sig == -1) { + if (errno == EINTR) + { /* ignore signals we didn't wait for */ + continue; + } DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno)); return 1; } @@ -101,9 +105,6 @@ static int run() DBG1(DBG_DMN, "signal of type SIGTERM received. Shutting down"); charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig); return 0; - default: - DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig); - break; } } } diff --git a/src/libfast/fast_dispatcher.c b/src/libfast/fast_dispatcher.c index b4c6ce3a6..66a2ee514 100644 --- a/src/libfast/fast_dispatcher.c +++ b/src/libfast/fast_dispatcher.c @@ -21,6 +21,7 @@ #include <fcgiapp.h> #include <signal.h> #include <unistd.h> +#include <errno.h> #include <utils/debug.h> #include <threading/thread.h> @@ -389,7 +390,10 @@ METHOD(fast_dispatcher_t, waitsignal, void, sigaddset(&set, SIGTERM); sigaddset(&set, SIGHUP); sigprocmask(SIG_BLOCK, &set, NULL); - sigwaitinfo(&set, NULL); + while (sigwaitinfo(&set, NULL) == -1 && errno == EINTR) + { + /* wait for signal */ + } } METHOD(fast_dispatcher_t, destroy, void, diff --git a/src/libstrongswan/utils/utils.c b/src/libstrongswan/utils/utils.c index 4e86165cf..40cb43d90 100644 --- a/src/libstrongswan/utils/utils.c +++ b/src/libstrongswan/utils/utils.c @@ -124,7 +124,10 @@ void wait_sigint() sigaddset(&set, SIGTERM); sigprocmask(SIG_BLOCK, &set, NULL); - sigwaitinfo(&set, NULL); + while (sigwaitinfo(&set, NULL) == -1 && errno == EINTR) + { + /* wait for signal */ + } } #ifndef HAVE_SIGWAITINFO |