Do not block SIGTERM in init's child processes

Previously, unless the process unblocks the signal by itself,
the signal was never delivered to the process. This caused at
least one CTS test failure.

Bug: 72453675
Test: 'kill -TERM app_pid' terminates the app process

Change-Id: I3977cac75e2673b52c5cf91d34d7a9c258c1a0e4
This commit is contained in:
yusukes 2018-02-01 17:14:30 -08:00
parent 0ce76f910b
commit 4a4ec14e42

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";