| Index: process/process_util_unittest.cc
|
| diff --git a/process/process_util_unittest.cc b/process/process_util_unittest.cc
|
| index cf83aa751815406817e88d8beacdd41ecd82d41a..08144f2a18ec58789edd1cfdcbe988d411504cb4 100644
|
| --- a/process/process_util_unittest.cc
|
| +++ b/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);
|
|
|