| Index: base/process/process_util_unittest.cc
|
| diff --git a/base/process/process_util_unittest.cc b/base/process/process_util_unittest.cc
|
| index 6c1a3f1d7619d2b128efb58b6c810c2c79023eae..0ca4e3ae7d76568aaa6b8c489e7edf4bc7d56da9 100644
|
| --- a/base/process/process_util_unittest.cc
|
| +++ b/base/process/process_util_unittest.cc
|
| @@ -59,6 +59,9 @@
|
| #include <malloc/malloc.h>
|
| #include "base/mac/mac_util.h"
|
| #endif
|
| +#if defined(OS_ANDROID)
|
| +#include "third_party/lss/linux_syscall_support.h"
|
| +#endif
|
|
|
| using base::FilePath;
|
|
|
| @@ -226,7 +229,19 @@ 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);
|
|
|