diff options
author | Mark Salyzyn <salyzyn@google.com> | 2018-12-14 20:35:08 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-12-14 20:35:08 +0000 |
commit | 00289c9c794314e8468895fcc7d70282c833d6c4 (patch) | |
tree | a0e3f37b54b7bffc9a96d98313ea7d4981201519 /llkd | |
parent | 9a7a50aea0dfcb1a8c305f0b79e9a24d260db341 (diff) | |
parent | fbc3a75ef49fa6577e7914b3dcf2b81cba78112a (diff) | |
download | system_core-00289c9c794314e8468895fcc7d70282c833d6c4.tar.gz system_core-00289c9c794314e8468895fcc7d70282c833d6c4.tar.bz2 system_core-00289c9c794314e8468895fcc7d70282c833d6c4.zip |
Merge "llkd: make 100% sure process that triggers panic still exists"
Diffstat (limited to 'llkd')
-rw-r--r-- | llkd/libllkd.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llkd/libllkd.cpp b/llkd/libllkd.cpp index 969f26b2d..267da4ab8 100644 --- a/llkd/libllkd.cpp +++ b/llkd/libllkd.cpp @@ -510,9 +510,7 @@ bool llkWriteStringToFileConfirm(const std::string& string, const std::string& f return android::base::Trim(content) == string; } -void llkPanicKernel(bool dump, pid_t tid, const char* state, - const std::string& message = "") __noreturn; -void llkPanicKernel(bool dump, pid_t tid, const char* state, const std::string& message) { +void llkPanicKernel(bool dump, pid_t tid, const char* state, const std::string& message = "") { if (!message.empty()) LOG(ERROR) << message; auto sysrqTriggerFd = llkFileToWriteFd("/proc/sysrq-trigger"); if (sysrqTriggerFd < 0) { @@ -521,6 +519,7 @@ void llkPanicKernel(bool dump, pid_t tid, const char* state, const std::string& // The answer to life, the universe and everything ::exit(42); // NOTREACHED + return; } ::sync(); if (dump) { @@ -544,6 +543,13 @@ void llkPanicKernel(bool dump, pid_t tid, const char* state, const std::string& llkWriteStringToFile(message + (message.empty() ? "" : "\n") + "SysRq : Trigger a crash : 'livelock,"s + state + "'\n", "/dev/kmsg"); + // Because panic is such a serious thing to do, let us + // make sure that the tid being inspected still exists! + auto piddir = procdir + std::to_string(tid) + "/stat"; + if (access(piddir.c_str(), F_OK) != 0) { + PLOG(WARNING) << piddir; + return; + } android::base::WriteStringToFd("c", sysrqTriggerFd); // NOTREACHED // DYB @@ -909,6 +915,7 @@ milliseconds llkCheck(bool checkRunning) { ms -= llkCycle; auto myPid = ::getpid(); auto myTid = ::gettid(); + auto dump = true; for (auto dp = llkTopDirectory.read(); dp != nullptr; dp = llkTopDirectory.read()) { std::string piddir; @@ -1109,9 +1116,10 @@ milliseconds llkCheck(bool checkRunning) { const auto message = state + " "s + llkFormat(procp->count) + " " + std::to_string(ppid) + "->" + std::to_string(pid) + "->" + std::to_string(tid) + " " + procp->getComm() + " [panic]"; - llkPanicKernel(true, tid, + llkPanicKernel(dump, tid, (state == 'Z') ? "zombie" : (state == 'D') ? "driver" : "sleeping", message); + dump = false; } LOG(VERBOSE) << "+closedir()"; } |