sigwaitinfo() may fail with EINTR if interrupted by an unblocked signal not in the set
Fixes #1213.
This commit is contained in:
@@ -115,6 +115,10 @@ static int run()
|
|||||||
sig = sigwaitinfo(&set, NULL);
|
sig = sigwaitinfo(&set, NULL);
|
||||||
if (sig == -1)
|
if (sig == -1)
|
||||||
{
|
{
|
||||||
|
if (errno == EINTR)
|
||||||
|
{ /* ignore signals we didn't wait for */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -152,11 +156,6 @@ static int run()
|
|||||||
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
{
|
|
||||||
DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,6 +85,10 @@ static void run()
|
|||||||
sig = sigwaitinfo(&set, NULL);
|
sig = sigwaitinfo(&set, NULL);
|
||||||
if (sig == -1)
|
if (sig == -1)
|
||||||
{
|
{
|
||||||
|
if (errno == EINTR)
|
||||||
|
{ /* ignore signals we didn't wait for */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -102,11 +106,6 @@ static void run()
|
|||||||
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
{
|
|
||||||
DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -254,6 +254,10 @@ static int run()
|
|||||||
sig = sigwaitinfo(&set, NULL);
|
sig = sigwaitinfo(&set, NULL);
|
||||||
if (sig == -1)
|
if (sig == -1)
|
||||||
{
|
{
|
||||||
|
if (errno == EINTR)
|
||||||
|
{ /* ignore signals we didn't wait for */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
||||||
return SS_RC_INITIALIZATION_FAILED;
|
return SS_RC_INITIALIZATION_FAILED;
|
||||||
}
|
}
|
||||||
@@ -265,11 +269,6 @@ static int run()
|
|||||||
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
{
|
|
||||||
DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,6 +104,10 @@ static void run()
|
|||||||
sig = sigwaitinfo(&set, NULL);
|
sig = sigwaitinfo(&set, NULL);
|
||||||
if (sig == -1)
|
if (sig == -1)
|
||||||
{
|
{
|
||||||
|
if (errno == EINTR)
|
||||||
|
{ /* ignore signals we didn't wait for */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -121,11 +125,6 @@ static void run()
|
|||||||
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
{
|
|
||||||
DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-6
@@ -98,7 +98,7 @@ static void run()
|
|||||||
{
|
{
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
|
|
||||||
/* handle SIGINT, SIGHUP ans SIGTERM in this handler */
|
/* handle SIGINT, SIGHUP and SIGTERM in this handler */
|
||||||
sigemptyset(&set);
|
sigemptyset(&set);
|
||||||
sigaddset(&set, SIGINT);
|
sigaddset(&set, SIGINT);
|
||||||
sigaddset(&set, SIGHUP);
|
sigaddset(&set, SIGHUP);
|
||||||
@@ -112,6 +112,10 @@ static void run()
|
|||||||
sig = sigwaitinfo(&set, NULL);
|
sig = sigwaitinfo(&set, NULL);
|
||||||
if (sig == -1)
|
if (sig == -1)
|
||||||
{
|
{
|
||||||
|
if (errno == EINTR)
|
||||||
|
{ /* ignore signals we didn't wait for */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -144,11 +148,6 @@ static void run()
|
|||||||
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
{
|
|
||||||
DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -565,7 +565,7 @@ int main(int argc, char *argv[])
|
|||||||
sigaddset(&set, SIGTERM);
|
sigaddset(&set, SIGTERM);
|
||||||
sigprocmask(SIG_BLOCK, &set, NULL);
|
sigprocmask(SIG_BLOCK, &set, NULL);
|
||||||
|
|
||||||
while ((sig = sigwaitinfo(&set, NULL)) != -1)
|
while ((sig = sigwaitinfo(&set, NULL)) != -1 || errno == EINTR)
|
||||||
{
|
{
|
||||||
switch (sig)
|
switch (sig)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -88,6 +88,10 @@ static int run()
|
|||||||
sig = sigwaitinfo(&set, NULL);
|
sig = sigwaitinfo(&set, NULL);
|
||||||
if (sig == -1)
|
if (sig == -1)
|
||||||
{
|
{
|
||||||
|
if (errno == EINTR)
|
||||||
|
{ /* ignore signals we didn't wait for */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -101,9 +105,6 @@ static int run()
|
|||||||
DBG1(DBG_DMN, "signal of type SIGTERM received. Shutting down");
|
DBG1(DBG_DMN, "signal of type SIGTERM received. Shutting down");
|
||||||
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
|
||||||
DBG1(DBG_DMN, "unknown signal %d received. Ignored", sig);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include <fcgiapp.h>
|
#include <fcgiapp.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <utils/debug.h>
|
#include <utils/debug.h>
|
||||||
#include <threading/thread.h>
|
#include <threading/thread.h>
|
||||||
@@ -389,7 +390,10 @@ METHOD(fast_dispatcher_t, waitsignal, void,
|
|||||||
sigaddset(&set, SIGTERM);
|
sigaddset(&set, SIGTERM);
|
||||||
sigaddset(&set, SIGHUP);
|
sigaddset(&set, SIGHUP);
|
||||||
sigprocmask(SIG_BLOCK, &set, NULL);
|
sigprocmask(SIG_BLOCK, &set, NULL);
|
||||||
sigwaitinfo(&set, NULL);
|
while (sigwaitinfo(&set, NULL) == -1 && errno == EINTR)
|
||||||
|
{
|
||||||
|
/* wait for signal */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(fast_dispatcher_t, destroy, void,
|
METHOD(fast_dispatcher_t, destroy, void,
|
||||||
|
|||||||
@@ -124,7 +124,10 @@ void wait_sigint()
|
|||||||
sigaddset(&set, SIGTERM);
|
sigaddset(&set, SIGTERM);
|
||||||
|
|
||||||
sigprocmask(SIG_BLOCK, &set, NULL);
|
sigprocmask(SIG_BLOCK, &set, NULL);
|
||||||
sigwaitinfo(&set, NULL);
|
while (sigwaitinfo(&set, NULL) == -1 && errno == EINTR)
|
||||||
|
{
|
||||||
|
/* wait for signal */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HAVE_SIGWAITINFO
|
#ifndef HAVE_SIGWAITINFO
|
||||||
|
|||||||
Reference in New Issue
Block a user