From 4a4ec14e42e3a395086cfb8d992768a62b33aba4 Mon Sep 17 00:00:00 2001 From: yusukes Date: Thu, 1 Feb 2018 17:14:30 -0800 Subject: [PATCH] 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 --- init/init.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/init/init.cpp b/init/init.cpp index 79623c333..bd09e4bcc 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -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";