sigwaitinfo() may fail with EINTR if interrupted by an unblocked signal not in the set

Fixes #1213.
This commit is contained in:
Tobias Brunner 2015-11-19 11:21:48 +01:00
parent b675909662
commit 88b85e022a
9 changed files with 35 additions and 32 deletions

View File

@ -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;
}
}
}
}

View File

@ -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;
}
}
}
}

View File

@ -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;
}
}
}
}

View File

@ -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;
}
}
}
}

View File

@ -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;
}
}
}
}

View File

@ -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)
{

View File

@ -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;
}
}
}

View File

@ -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,

View File

@ -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