summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcullinan <cullinan@amazon.com>2015-07-20 18:00:47 -0700
committerCommit bot <commit-bot@chromium.org>2015-07-21 01:01:19 +0000
commit31510fe3e2d3b1f3123f391db52372b2506c46ca (patch)
treeb9918242e4c9ac002f2cdcca21201559dff9be56
parent71e75d8043292d014a344ed2453dcb821aaaf6aa (diff)
downloadchromium_src-31510fe3e2d3b1f3123f391db52372b2506c46ca.zip
chromium_src-31510fe3e2d3b1f3123f391db52372b2506c46ca.tar.gz
chromium_src-31510fe3e2d3b1f3123f391db52372b2506c46ca.tar.bz2
Fix ProcessUtilTest.GetTerminationStatusCrash on Android L+
On Android L+, signal and sigaction symbols are provided by libsigchain that override the system's versions. There is a bug in these functions where they essentially ignore requests to install SIG_DFL. This causes ProcessUtilTest.GetTerminationStatusCrash to fail (as CrashingChildProcess goes into infinite loop instead of crashing). Workaround this issue by explicitly performing a syscall to __NR_rt_sigaction to install SIG_DFL on Android, as breakpad does (see https://breakpad.appspot.com/1804002/). BUG=512255 TEST=ProcessUtilTest.GetTerminationStatusCrash Review URL: https://codereview.chromium.org/1241333002 Cr-Commit-Position: refs/heads/master@{#339584}
-rw-r--r--base/DEPS1
-rw-r--r--base/process/process_util_unittest.cc17
2 files changed, 17 insertions, 1 deletions
diff --git a/base/DEPS b/base/DEPS
index c632e35..6d91c8d 100644
--- a/base/DEPS
+++ b/base/DEPS
@@ -4,6 +4,7 @@ include_rules = [
"+third_party/apple_apsl",
"+third_party/libevent",
"+third_party/dmg_fp",
+ "+third_party/lss",
"+third_party/mach_override",
"+third_party/modp_b64",
"+third_party/tcmalloc",
diff --git a/base/process/process_util_unittest.cc b/base/process/process_util_unittest.cc
index 6c1a3f1..0ca4e3a 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);