Merge "Do not block SIGTERM in init's child processes"

This commit is contained in:
Treehugger Robot 2018-02-03 01:31:45 +00:00 committed by Gerrit Code Review
commit 176afbbedf
1 changed files with 17 additions and 0 deletions

View File

@ -19,6 +19,7 @@
#include <dirent.h>
#include <fcntl.h>
#include <paths.h>
#include <pthread.h>
#include <seccomp_policy.h>
#include <signal.h>
#include <stdlib.h>
@ -491,6 +492,16 @@ static void HandleSigtermSignal() {
HandlePowerctlMessage("shutdown,container");
}
static void UnblockSigterm() {
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGTERM);
if (sigprocmask(SIG_UNBLOCK, &mask, nullptr) == -1) {
PLOG(FATAL) << "failed to unblock SIGTERM for PID " << getpid();
}
}
static void InstallSigtermHandler() {
sigset_t mask;
sigemptyset(&mask);
@ -500,6 +511,12 @@ static void InstallSigtermHandler() {
PLOG(FATAL) << "failed to block SIGTERM";
}
// Register a handler to unblock SIGTERM in the child processes.
const int result = pthread_atfork(nullptr, nullptr, &UnblockSigterm);
if (result != 0) {
LOG(FATAL) << "Failed to register a fork handler: " << strerror(result);
}
sigterm_signal_fd = signalfd(-1, &mask, SFD_CLOEXEC);
if (sigterm_signal_fd == -1) {
PLOG(FATAL) << "failed to create signalfd for SIGTERM";