diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-09-16 03:13:13 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-09-16 03:13:13 +0000 |
commit | 2833c7dc7635380a0b985273632135fec2fc0c33 (patch) | |
tree | 69dda4a2cabd7246eb4a0202b57d130238b9a981 /debuggerd/handler/debuggerd_handler.cpp | |
parent | 5a1aa2b24ff9c1bbd1e766ba3aa73748d9cd91e7 (diff) | |
parent | 3c2a5166c6ea4b6db5048980536282adc2c97efd (diff) |
Snap for 5012867 from 3c2a5166c6ea4b6db5048980536282adc2c97efd to qt-release
Change-Id: Ib31c32c4c01ff620de182a4aa26b763230f4330c
Diffstat (limited to 'debuggerd/handler/debuggerd_handler.cpp')
-rw-r--r-- | debuggerd/handler/debuggerd_handler.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/debuggerd/handler/debuggerd_handler.cpp b/debuggerd/handler/debuggerd_handler.cpp index 15557b6d8..a064ca0f7 100644 --- a/debuggerd/handler/debuggerd_handler.cpp +++ b/debuggerd/handler/debuggerd_handler.cpp @@ -58,6 +58,8 @@ #include "dump_type.h" #include "protocol.h" +#include "handler/fallback.h" + using android::base::Pipe; // We muck with our fds in a 'thread' that doesn't share the same fd table. @@ -473,13 +475,15 @@ static void debuggerd_signal_handler(int signal_number, siginfo_t* info, void* c } void* abort_message = nullptr; + uintptr_t si_val = reinterpret_cast<uintptr_t>(info->si_ptr); if (signal_number == DEBUGGER_SIGNAL) { if (info->si_code == SI_QUEUE && info->si_pid == __getpid()) { // Allow for the abort message to be explicitly specified via the sigqueue value. // Keep the bottom bit intact for representing whether we want a backtrace or a tombstone. - uintptr_t value = reinterpret_cast<uintptr_t>(info->si_ptr); - abort_message = reinterpret_cast<void*>(value & ~1); - info->si_ptr = reinterpret_cast<void*>(value & 1); + if (si_val != kDebuggerdFallbackSivalUintptrRequestDump) { + abort_message = reinterpret_cast<void*>(si_val & ~1); + info->si_ptr = reinterpret_cast<void*>(si_val & 1); + } } } else { if (g_callbacks.get_abort_message) { @@ -492,7 +496,8 @@ static void debuggerd_signal_handler(int signal_number, siginfo_t* info, void* c // of a specific thread. It is possible that the prctl call might return 1, // then return 0 in subsequent calls, so check the sival_int to determine if // the fallback handler should be called first. - if (info->si_value.sival_int == ~0 || prctl(PR_GET_NO_NEW_PRIVS, 0, 0, 0, 0) == 1) { + if (si_val == kDebuggerdFallbackSivalUintptrRequestDump || + prctl(PR_GET_NO_NEW_PRIVS, 0, 0, 0, 0) == 1) { // This check might be racy if another thread sets NO_NEW_PRIVS, but this should be unlikely, // you can only set NO_NEW_PRIVS to 1, and the effect should be at worst a single missing // ANR trace. |