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()); |