init: use a no-op signal handler instead of SIG_IGN for SIGPIPE
We want to ignore SIGPIPE within init, but if we use SIG_IGN, that would be inherited by child processes through exec(), which we do not want to have happen. We instead set up a real signal handler with a no-op handler function, that will ignore SIGPIPE within init, but will not be inherited across exec(). This fixesc29c2baa69("init: Add support for native service registration with lmkd"), when SIG_IGN was introduced. Note that we caught this issue before shipping a release with that change, so the major motivation here is to not cause a behavior change in init. Bug: 151581751 Test: children of init that don't explicitly block SIGPIPE exit when sent SIGPIPE Test: children of init that do explicitly block SIGPIPE do not exit when sent SIGPIPE Test: init does not exit when sent SIGPIPE Test: init exits when sent SIGABRT Merged-In: Ieda8555fd03836bcd672a422fe673a8369ad9beb Change-Id: Ieda8555fd03836bcd672a422fe673a8369ad9beb (cherry picked from commitfd470e87cc)
This commit is contained in:
parent
c2872d831d
commit
2bf886afc2
1 changed files with 9 additions and 2 deletions
|
|
@ -713,8 +713,15 @@ int SecondStageMain(int argc, char** argv) {
|
|||
InitKernelLogging(argv);
|
||||
LOG(INFO) << "init second stage started!";
|
||||
|
||||
// Will handle EPIPE at the time of write by checking the errno
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
// Init should not crash because of a dependence on any other process, therefore we ignore
|
||||
// SIGPIPE and handle EPIPE at the call site directly. Note that setting a signal to SIG_IGN
|
||||
// is inherited across exec, but custom signal handlers are not. Since we do not want to
|
||||
// ignore SIGPIPE for child processes, we set a no-op function for the signal handler instead.
|
||||
{
|
||||
struct sigaction action = {.sa_flags = SA_RESTART};
|
||||
action.sa_handler = [](int) {};
|
||||
sigaction(SIGPIPE, &action, nullptr);
|
||||
}
|
||||
|
||||
// Set init and its forked children's oom_adj.
|
||||
if (auto result =
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue