summaryrefslogtreecommitdiffstats
path: root/llkd
diff options
context:
space:
mode:
authorMark Salyzyn <salyzyn@google.com>2018-12-14 20:35:08 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-12-14 20:35:08 +0000
commit00289c9c794314e8468895fcc7d70282c833d6c4 (patch)
treea0e3f37b54b7bffc9a96d98313ea7d4981201519 /llkd
parent9a7a50aea0dfcb1a8c305f0b79e9a24d260db341 (diff)
parentfbc3a75ef49fa6577e7914b3dcf2b81cba78112a (diff)
downloadsystem_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.cpp16
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()";
}