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

am: 176afbbedf

Change-Id: I26bcb38bf2082da18e753afe5761b6c0460fc85c
This commit is contained in:
yusukes 2018-02-03 04:19:18 +00:00 committed by android-build-merger
commit 495a672f4c
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";