From 12b71294064e6dc0a225e19ce179e702f481d6a6 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Thu, 2 Mar 2017 19:01:20 -0800 Subject: [PATCH] Small debuggerd improvements. Include the ABI in seccomp causes. Slightly improved command-line usage information. Fix crasher for seccomp failures. Bug: N/A Test: crasher Change-Id: Ie419ecfe72ee4f5ccf49c927be18350a58a66a90 --- debuggerd/crasher/Android.bp | 2 ++ debuggerd/crasher/crasher.cpp | 3 +++ debuggerd/debuggerd.cpp | 8 +++++--- debuggerd/libdebuggerd/tombstone.cpp | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/debuggerd/crasher/Android.bp b/debuggerd/crasher/Android.bp index 47278940e..f73f672fb 100644 --- a/debuggerd/crasher/Android.bp +++ b/debuggerd/crasher/Android.bp @@ -48,6 +48,7 @@ cc_binary { shared_libs: [ "libbase", "liblog", + "libseccomp_policy", ], multilib: { lib32: { @@ -69,6 +70,7 @@ cc_binary { "libdebuggerd_handler", "libbase", "liblog", + "libseccomp_policy", ], multilib: { lib32: { diff --git a/debuggerd/crasher/crasher.cpp b/debuggerd/crasher/crasher.cpp index 1c01e3ef5..697020171 100644 --- a/debuggerd/crasher/crasher.cpp +++ b/debuggerd/crasher/crasher.cpp @@ -33,6 +33,8 @@ #include #include +#include "seccomp_policy.h" + #if defined(STATIC_CRASHER) #include "debuggerd/handler.h" #endif @@ -269,6 +271,7 @@ noinline int do_action(const char* arg) { munmap(map, sizeof(int)); map[0] = '8'; } else if (!strcasecmp(arg, "seccomp")) { + set_seccomp_filter(); syscall(99999); #if defined(__arm__) } else if (!strcasecmp(arg, "kuser_helper_version")) { diff --git a/debuggerd/debuggerd.cpp b/debuggerd/debuggerd.cpp index 0c5d3cf9b..492e9f023 100644 --- a/debuggerd/debuggerd.cpp +++ b/debuggerd/debuggerd.cpp @@ -34,6 +34,8 @@ using android::base::unique_fd; static void usage(int exit_code) { fprintf(stderr, "usage: debuggerd [-b] PID\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "-b, --backtrace just a backtrace rather than a full tombstone\n"); _exit(exit_code); } @@ -56,7 +58,8 @@ static std::thread spawn_redirect_thread(unique_fd fd) { int main(int argc, char* argv[]) { if (argc <= 1) usage(0); if (argc > 3) usage(1); - if (argc == 3 && strcmp(argv[1], "-b") != 0) usage(1); + if (argc == 3 && strcmp(argv[1], "-b") != 0 && strcmp(argv[1], "--backtrace") != 0) usage(1); + bool backtrace_only = argc == 3; pid_t pid; if (!android::base::ParseInt(argv[argc - 1], &pid, 1, std::numeric_limits::max())) { @@ -69,9 +72,8 @@ int main(int argc, char* argv[]) { } std::thread redirect_thread = spawn_redirect_thread(std::move(piperead)); - bool backtrace = argc == 3; if (!debuggerd_trigger_dump(pid, std::move(pipewrite), - backtrace ? kDebuggerdBacktrace : kDebuggerdTombstone, 0)) { + backtrace_only ? kDebuggerdBacktrace : kDebuggerdTombstone, 0)) { redirect_thread.join(); errx(1, "failed to dump process %d", pid); } diff --git a/debuggerd/libdebuggerd/tombstone.cpp b/debuggerd/libdebuggerd/tombstone.cpp index 3166bfc9d..4686bfdc8 100644 --- a/debuggerd/libdebuggerd/tombstone.cpp +++ b/debuggerd/libdebuggerd/tombstone.cpp @@ -214,7 +214,8 @@ static void dump_probable_cause(log_t* log, const siginfo_t& si) { cause = "call to kuser_cmpxchg64"; } } else if (si.si_signo == SIGSYS && si.si_code == SYS_SECCOMP) { - cause = StringPrintf("seccomp prevented call to disallowed system call %d", si.si_syscall); + cause = StringPrintf("seccomp prevented call to disallowed %s system call %d", + ABI_STRING, si.si_syscall); } if (!cause.empty()) _LOG(log, logtype::HEADER, "Cause: %s\n", cause.c_str());