4 Commits

Author SHA1 Message Date
cjhopman@chromium.org
80fd81452d Merge 1447 "Fix call to rt_sigaction"
> Fix call to rt_sigaction
> 
> Despite the fact that many places imply that sigaction and rt_sigaction
> are essentially the same, rt_sigaction's signature is actually
> different-- it takes the size of the kernel's sigset_t as an extra argument.
> 
> BUG=473973
> 

TBR=cjhopman@chromium.org

Review URL: https://breakpad.appspot.com/5784002

git-svn-id: http://google-breakpad.googlecode.com/svn/branches/chrome_42@1448 4c0a9323-5329-0410-9bdc-e9ce6186880e
2015-04-15 23:12:21 +00:00
mark@chromium.org
1ff31641a5 Merge trunk r1443 to the chrome_42 branch.
Use __NR_rt_sigaction instead of __NR_sigaction

__NR_sigaction is not defined on arm64/x64/etc (or rather, it's defined
in unistd-32.h instead of unistd.h).

Patch by Chris Hopman <cjhopman@chromium.org>
Review URL: https://breakpad.appspot.com/10724002/


git-svn-id: http://google-breakpad.googlecode.com/svn/branches/chrome_42@1444 4c0a9323-5329-0410-9bdc-e9ce6186880e
2015-04-14 00:00:40 +00:00
mark@chromium.org
21d9c3f9b9 Merge trunk r1438 to the chrome_42 branch.
Workaround Android sigaction bug

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.

Workaround this issue by explicitly performing a syscall to
__NR_rt_sigaction to install SIG_DFL on Android.

BUG=473973

Patch by Chris Hopman <cjhopman@chromium.org>
Review URL: https://breakpad.appspot.com/1804002/


git-svn-id: http://google-breakpad.googlecode.com/svn/branches/chrome_42@1439 4c0a9323-5329-0410-9bdc-e9ce6186880e
2015-04-10 18:03:08 +00:00
mark@chromium.org
959c06153a Branch at trunk r1427 for Chrome 42.0.2311.
git-svn-id: http://google-breakpad.googlecode.com/svn/branches/chrome_42@1436 4c0a9323-5329-0410-9bdc-e9ce6186880e
2015-04-10 17:53:36 +00:00

View File

@@ -188,6 +188,24 @@ void RestoreAlternateStackLocked() {
stack_installed = false;
}
void InstallDefaultHandler(int sig) {
#if defined(__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 breakpad's 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(sig, &sa, NULL, sizeof(kernel_sigset_t));
#else
signal(sig, SIG_DFL);
#endif
}
// The global exception handler stack. This is needed because there may exist
// multiple ExceptionHandler instances in a process. Each will have itself
// registered in this stack.
@@ -283,7 +301,7 @@ void ExceptionHandler::RestoreHandlersLocked() {
for (int i = 0; i < kNumHandledSignals; ++i) {
if (sigaction(kExceptionSignals[i], &old_handlers[i], NULL) == -1) {
signal(kExceptionSignals[i], SIG_DFL);
InstallDefaultHandler(kExceptionSignals[i]);
}
}
handlers_installed = false;
@@ -323,7 +341,7 @@ void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {
if (sigaction(sig, &cur_handler, NULL) == -1) {
// When resetting the handler fails, try to reset the
// default one to avoid an infinite loop here.
signal(sig, SIG_DFL);
InstallDefaultHandler(sig);
}
pthread_mutex_unlock(&g_handler_stack_mutex_);
return;
@@ -340,7 +358,7 @@ void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {
// previously installed handler. Then, when the signal is retriggered, it will
// be delivered to the appropriate handler.
if (handled) {
signal(sig, SIG_DFL);
InstallDefaultHandler(sig);
} else {
RestoreHandlersLocked();
}