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:
parent
0ce76f910b
commit
4a4ec14e42
1 changed files with 17 additions and 0 deletions
|
|
@ -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";
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue