summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Salyzyn <salyzyn@google.com>2016-08-11 16:07:10 -0700
committerMark Salyzyn <salyzyn@google.com>2016-08-12 07:31:47 -0700
commitf34d76ea650b1b05424293fe0b6e27bb71e9ca4e (patch)
tree058f05c80b027e1fc6dad537d7014751c1492dce
parentc1167dd4c96a1638a5e5bb163d225abb99b15816 (diff)
logd: klogd crash (part deux)
(cherry pick from commit 83b247891cea88347b759d638814cea61995d2ca) LogBuffer::pidToUid(pid_t pid) { return stats.pidToUid(pid); } needs to have LogBuffer::lock()/unlock() to prevent unordered_map data corruption. This can lead to multiple symptoms, crashes and continuous spins on corrupted iterators. Bug: 30688716 Bug: 30050636 Bug: 30614675 Bug: 25620123 Bug: 30792935 Change-Id: I1d8fec8e5fda98c6a08645e7456b081507696b3c
-rw-r--r--logd/LogKlog.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/logd/LogKlog.cpp b/logd/LogKlog.cpp
index da0aecc39..c7506efb8 100644
--- a/logd/LogKlog.cpp
+++ b/logd/LogKlog.cpp
@@ -26,6 +26,7 @@
#include <syslog.h>
#include <log/logger.h>
+#include <private/android_filesystem_config.h>
#include "LogBuffer.h"
#include "LogKlog.h"
@@ -614,7 +615,12 @@ int LogKlog::log(const char *buf, size_t len) {
// Parse pid, tid and uid
const pid_t pid = sniffPid(&p, len - (p - buf));
const pid_t tid = pid;
- const uid_t uid = pid ? logbuf->pidToUid(pid) : 0;
+ uid_t uid = AID_ROOT;
+ if (pid) {
+ logbuf->lock();
+ uid = logbuf->pidToUid(pid);
+ logbuf->unlock();
+ }
// Parse (rules at top) to pull out a tag from the incoming kernel message.
// Some may view the following as an ugly heuristic, the desire is to