diff options
author | Treehugger Robot | 2018-01-08 17:32:22 -0600 |
---|---|---|
committer | Gerrit Code Review | 2018-01-08 17:32:22 -0600 |
commit | be10cae468d969a25bd83ce7e08f23c57e204c14 (patch) | |
tree | d91582a031115e6084a8249f4ae6daf143024552 | |
parent | acaeeeed7351cc1fe035c84bc96729bc0a02400d (diff) | |
parent | 4841e744c2e148a68c0f592729d55fa41f39c112 (diff) | |
download | platform-system-core-be10cae468d969a25bd83ce7e08f23c57e204c14.tar.gz platform-system-core-be10cae468d969a25bd83ce7e08f23c57e204c14.tar.xz platform-system-core-be10cae468d969a25bd83ce7e08f23c57e204c14.zip |
Merge "debuggerd_handler: set PR_SET_PTRACER before running crash_dump."
-rw-r--r-- | debuggerd/handler/debuggerd_handler.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/debuggerd/handler/debuggerd_handler.cpp b/debuggerd/handler/debuggerd_handler.cpp index 96f3c7c54..05e6efa60 100644 --- a/debuggerd/handler/debuggerd_handler.cpp +++ b/debuggerd/handler/debuggerd_handler.cpp | |||
@@ -500,6 +500,17 @@ static void debuggerd_signal_handler(int signal_number, siginfo_t* info, void* c | |||
500 | fatal_errno("failed to set dumpable"); | 500 | fatal_errno("failed to set dumpable"); |
501 | } | 501 | } |
502 | 502 | ||
503 | // On kernels with yama_ptrace enabled, also allow any process to attach. | ||
504 | bool restore_orig_ptracer = true; | ||
505 | if (prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY) != 0) { | ||
506 | if (errno == EINVAL) { | ||
507 | // This kernel does not support PR_SET_PTRACER_ANY, or Yama is not enabled. | ||
508 | restore_orig_ptracer = false; | ||
509 | } else { | ||
510 | fatal_errno("failed to set traceable"); | ||
511 | } | ||
512 | } | ||
513 | |||
503 | // Essentially pthread_create without CLONE_FILES, so we still work during file descriptor | 514 | // Essentially pthread_create without CLONE_FILES, so we still work during file descriptor |
504 | // exhaustion. | 515 | // exhaustion. |
505 | pid_t child_pid = | 516 | pid_t child_pid = |
@@ -521,6 +532,11 @@ static void debuggerd_signal_handler(int signal_number, siginfo_t* info, void* c | |||
521 | fatal_errno("failed to restore dumpable"); | 532 | fatal_errno("failed to restore dumpable"); |
522 | } | 533 | } |
523 | 534 | ||
535 | // Restore PR_SET_PTRACER to its original value. | ||
536 | if (restore_orig_ptracer && prctl(PR_SET_PTRACER, 0) != 0) { | ||
537 | fatal_errno("failed to restore traceable"); | ||
538 | } | ||
539 | |||
524 | if (info->si_signo == DEBUGGER_SIGNAL) { | 540 | if (info->si_signo == DEBUGGER_SIGNAL) { |
525 | // If the signal is fatal, don't unlock the mutex to prevent other crashing threads from | 541 | // If the signal is fatal, don't unlock the mutex to prevent other crashing threads from |
526 | // starting to dump right before our death. | 542 | // starting to dump right before our death. |