| Index: base/process/process_util_unittest.cc
|
| diff --git a/base/process/process_util_unittest.cc b/base/process/process_util_unittest.cc
|
| index 7031706e0b7796721e098ca6b72aa2b8b126b7f6..87fdd0123097e51739a2bc1830e34f584302fdc8 100644
|
| --- a/base/process/process_util_unittest.cc
|
| +++ b/base/process/process_util_unittest.cc
|
| @@ -257,7 +257,7 @@
|
| }
|
| #endif // defined(OS_WIN)
|
|
|
| -#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
|
| +#if !defined(OS_MACOSX)
|
| // This test is disabled on Mac, since it's flaky due to ReportCrash
|
| // taking a variable amount of time to parse and load the debug and
|
| // symbol data for this unit test's executable before firing the
|
| @@ -266,14 +266,23 @@
|
| // TODO(gspencer): turn this test process into a very small program
|
| // with no symbols (instead of using the multiprocess testing
|
| // framework) to reduce the ReportCrash overhead.
|
| -//
|
| -// It is disabled on Android as MultiprocessTests are started as services that
|
| -// the framework restarts on crashes.
|
| const char kSignalFileCrash[] = "CrashingChildProcess.die";
|
|
|
| MULTIPROCESS_TEST_MAIN(CrashingChildProcess) {
|
| WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileCrash).c_str());
|
| -#if defined(OS_POSIX)
|
| +#if defined(OS_ANDROID)
|
| + // Android L+ expose signal and sigaction symbols that override the system
|
| + // ones. There is a bug in these functions where a request to set the handler
|
| + // to SIG_DFL is ignored. In that case, an infinite loop is entered as the
|
| + // signal is repeatedly sent to the crash dump signal handler.
|
| + // To work around this, directly call the system's sigaction.
|
| + struct kernel_sigaction sa;
|
| + memset(&sa, 0, sizeof(sa));
|
| + sys_sigemptyset(&sa.sa_mask);
|
| + sa.sa_handler_ = SIG_DFL;
|
| + sa.sa_flags = SA_RESTART;
|
| + sys_rt_sigaction(SIGSEGV, &sa, NULL, sizeof(kernel_sigset_t));
|
| +#elif defined(OS_POSIX)
|
| // Have to disable to signal handler for segv so we can get a crash
|
| // instead of an abnormal termination through the crash dump handler.
|
| ::signal(SIGSEGV, SIG_DFL);
|
| @@ -322,7 +331,7 @@
|
| base::debug::EnableInProcessStackDumping();
|
| remove(signal_file.c_str());
|
| }
|
| -#endif // !defined(OS_MACOSX) && !defined(OS_ANDROID)
|
| +#endif // !defined(OS_MACOSX)
|
|
|
| MULTIPROCESS_TEST_MAIN(KilledChildProcess) {
|
| WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileKill).c_str());
|
|
|