Loading debuggerd/libdebuggerd/tombstone.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -595,7 +595,7 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, unsigned } AndroidLogEntry e; char buf[512]; if (android_log_processBinaryLogBuffer(&log_entry.entry_v1, &e, g_eventTagMap, buf, if (android_log_processBinaryLogBuffer(&log_entry.entry, &e, g_eventTagMap, buf, sizeof(buf)) == 0) { _LOG(log, logtype::LOGS, "%s.%03d %5d %5d %c %-8.*s: %s\n", timeBuf, log_entry.entry.nsec / 1000000, log_entry.entry.pid, log_entry.entry.tid, 'I', Loading liblog/include/log/log_read.h +4 −59 Original line number Diff line number Diff line Loading @@ -50,53 +50,9 @@ extern "C" { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wzero-length-array" /* * The userspace structure for version 1 of the logger_entry ABI. */ struct logger_entry { uint16_t len; /* length of the payload */ uint16_t __pad; /* no matter what, we get 2 bytes of padding */ int32_t pid; /* generating process's pid */ int32_t tid; /* generating process's tid */ int32_t sec; /* seconds since Epoch */ int32_t nsec; /* nanoseconds */ char msg[0]; /* the entry's payload */ }; /* * The userspace structure for version 2 of the logger_entry ABI. */ struct logger_entry_v2 { uint16_t len; /* length of the payload */ uint16_t hdr_size; /* sizeof(struct logger_entry_v2) */ int32_t pid; /* generating process's pid */ int32_t tid; /* generating process's tid */ int32_t sec; /* seconds since Epoch */ int32_t nsec; /* nanoseconds */ uint32_t euid; /* effective UID of logger */ char msg[0]; /* the entry's payload */ } __attribute__((__packed__)); /* * The userspace structure for version 3 of the logger_entry ABI. */ struct logger_entry_v3 { uint16_t len; /* length of the payload */ uint16_t hdr_size; /* sizeof(struct logger_entry_v3) */ int32_t pid; /* generating process's pid */ int32_t tid; /* generating process's tid */ int32_t sec; /* seconds since Epoch */ int32_t nsec; /* nanoseconds */ uint32_t lid; /* log id of the payload */ char msg[0]; /* the entry's payload */ } __attribute__((__packed__)); /* * The userspace structure for version 4 of the logger_entry ABI. */ struct logger_entry_v4 { uint16_t len; /* length of the payload */ uint16_t hdr_size; /* sizeof(struct logger_entry_v4) */ uint16_t hdr_size; /* sizeof(struct logger_entry) */ int32_t pid; /* generating process's pid */ uint32_t tid; /* generating process's tid */ uint32_t sec; /* seconds since Epoch */ Loading Loading @@ -124,11 +80,7 @@ struct logger_entry_v4 { struct log_msg { union { unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1]; struct logger_entry_v4 entry; struct logger_entry_v4 entry_v4; struct logger_entry_v3 entry_v3; struct logger_entry_v2 entry_v2; struct logger_entry entry_v1; struct logger_entry entry; } __attribute__((aligned(4))); #ifdef __cplusplus /* Matching log_time operators */ Loading Loading @@ -162,19 +114,12 @@ struct log_msg { } char* msg() { unsigned short hdr_size = entry.hdr_size; if (!hdr_size) { hdr_size = sizeof(entry_v1); } if ((hdr_size < sizeof(entry_v1)) || (hdr_size > sizeof(entry))) { if (hdr_size != sizeof(entry)) { return nullptr; } return reinterpret_cast<char*>(buf) + hdr_size; } unsigned int len() { return (entry.hdr_size ? entry.hdr_size : static_cast<uint16_t>(sizeof(entry_v1))) + entry.len; } unsigned int len() { return entry.hdr_size + entry.len; } #endif }; Loading liblog/logger_read.cpp +9 −17 Original line number Diff line number Diff line Loading @@ -273,34 +273,26 @@ static int android_transport_read(struct android_log_logger_list* logger_list, struct log_msg* log_msg) { int ret = (*transp->transport->read)(logger_list, transp, log_msg); if (ret < 0) { return ret; } if (ret > (int)sizeof(*log_msg)) { ret = sizeof(*log_msg); } transp->ret = ret; /* propagate errors, or make sure len & hdr_size members visible */ if (ret < (int)(sizeof(log_msg->entry.len) + sizeof(log_msg->entry.hdr_size))) { if (ret >= (int)sizeof(log_msg->entry.len)) { log_msg->entry.len = 0; } return ret; if (ret < static_cast<int>(sizeof(log_msg->entry))) { return -EINVAL; } /* hdr_size correction (logger_entry -> logger_entry_v2+ conversion) */ if (log_msg->entry_v2.hdr_size == 0) { log_msg->entry_v2.hdr_size = sizeof(struct logger_entry); } if ((log_msg->entry_v2.hdr_size < sizeof(log_msg->entry_v1)) || (log_msg->entry_v2.hdr_size > sizeof(log_msg->entry))) { if (log_msg->entry.hdr_size != sizeof(log_msg->entry)) { return -EINVAL; } /* len validation */ if (ret <= log_msg->entry_v2.hdr_size) { log_msg->entry.len = 0; } else { log_msg->entry.len = ret - log_msg->entry_v2.hdr_size; if (log_msg->entry.len > ret - log_msg->entry.hdr_size) { return -EINVAL; } return ret; Loading liblog/logprint.cpp +12 −33 Original line number Diff line number Diff line Loading @@ -532,18 +532,12 @@ int android_log_processLogBuffer(struct logger_entry* buf, AndroidLogEntry* entr int i; char* msg = buf->msg; struct logger_entry_v2* buf2 = (struct logger_entry_v2*)buf; if (buf2->hdr_size) { if ((buf2->hdr_size < sizeof(((struct log_msg*)NULL)->entry_v1)) || (buf2->hdr_size > sizeof(((struct log_msg*)NULL)->entry))) { if (buf->hdr_size != sizeof(struct logger_entry)) { fprintf(stderr, "+++ LOG: entry illegal hdr_size\n"); return -1; } msg = ((char*)buf2) + buf2->hdr_size; if (buf2->hdr_size >= sizeof(struct logger_entry_v4)) { entry->uid = ((struct logger_entry_v4*)buf)->uid; } } entry->uid = buf->uid; for (i = 1; i < buf->len; i++) { if (msg[i] == '\0') { if (msgStart == -1) { Loading Loading @@ -993,27 +987,15 @@ int android_log_processBinaryLogBuffer( entry->pid = buf->pid; entry->tid = buf->tid; /* * Pull the tag out, fill in some additional details based on incoming * buffer version (v3 adds lid, v4 adds uid). */ eventData = (const unsigned char*)buf->msg; struct logger_entry_v2* buf2 = (struct logger_entry_v2*)buf; if (buf2->hdr_size) { if ((buf2->hdr_size < sizeof(((struct log_msg*)NULL)->entry_v1)) || (buf2->hdr_size > sizeof(((struct log_msg*)NULL)->entry))) { if (buf->hdr_size != sizeof(struct logger_entry)) { fprintf(stderr, "+++ LOG: entry illegal hdr_size\n"); return -1; } eventData = ((unsigned char*)buf2) + buf2->hdr_size; if ((buf2->hdr_size >= sizeof(struct logger_entry_v3)) && (((struct logger_entry_v3*)buf)->lid == LOG_ID_SECURITY)) { if (buf->lid == LOG_ID_SECURITY) { entry->priority = ANDROID_LOG_WARN; } if (buf2->hdr_size >= sizeof(struct logger_entry_v4)) { entry->uid = ((struct logger_entry_v4*)buf)->uid; } } entry->uid = buf->uid; inCount = buf->len; if (inCount < sizeof(android_event_header_t)) return -1; auto* event_header = reinterpret_cast<const android_event_header_t*>(eventData); Loading Loading @@ -1069,9 +1051,6 @@ int android_log_processBinaryLogBuffer( if ((result == 1) && fmtStr) { /* We overflowed :-(, let's repaint the line w/o format dressings */ eventData = (const unsigned char*)buf->msg; if (buf2->hdr_size) { eventData = ((unsigned char*)buf2) + buf2->hdr_size; } eventData += 4; outBuf = messageBuf; outRemaining = messageBufLen - 1; Loading liblog/pmsg_reader.cpp +14 −14 Original line number Diff line number Diff line Loading @@ -144,7 +144,7 @@ static int pmsgRead(struct android_log_logger_list* logger_list, ((logger_list->start.tv_sec != buf.l.realtime.tv_sec) || (logger_list->start.tv_nsec <= buf.l.realtime.tv_nsec)))) && (!logger_list->pid || (logger_list->pid == buf.p.pid))) { char* msg = log_msg->entry_v4.msg; char* msg = log_msg->entry.msg; *msg = buf.prio; fd = atomic_load(&transp->context.fd); if (fd <= 0) { Loading @@ -158,16 +158,16 @@ static int pmsgRead(struct android_log_logger_list* logger_list, return -EIO; } log_msg->entry_v4.len = buf.p.len - sizeof(buf) + sizeof(buf.prio); log_msg->entry_v4.hdr_size = sizeof(log_msg->entry_v4); log_msg->entry_v4.pid = buf.p.pid; log_msg->entry_v4.tid = buf.l.tid; log_msg->entry_v4.sec = buf.l.realtime.tv_sec; log_msg->entry_v4.nsec = buf.l.realtime.tv_nsec; log_msg->entry_v4.lid = buf.l.id; log_msg->entry_v4.uid = buf.p.uid; log_msg->entry.len = buf.p.len - sizeof(buf) + sizeof(buf.prio); log_msg->entry.hdr_size = sizeof(log_msg->entry); log_msg->entry.pid = buf.p.pid; log_msg->entry.tid = buf.l.tid; log_msg->entry.sec = buf.l.realtime.tv_sec; log_msg->entry.nsec = buf.l.realtime.tv_nsec; log_msg->entry.lid = buf.l.id; log_msg->entry.uid = buf.p.uid; return ret + sizeof(buf.prio) + log_msg->entry_v4.hdr_size; return ret + sizeof(buf.prio) + log_msg->entry.hdr_size; } fd = atomic_load(&transp->context.fd); Loading Loading @@ -215,7 +215,7 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref struct android_log_transport_context transp; struct content { struct listnode node; struct logger_entry_v4 entry; struct logger_entry entry; } * content; struct names { struct listnode node; Loading Loading @@ -269,12 +269,12 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref /* Read the file content */ while (pmsgRead(&logger_list, &transp, &transp.logMsg) > 0) { const char* cp; size_t hdr_size = transp.logMsg.entry.hdr_size ? transp.logMsg.entry.hdr_size : sizeof(transp.logMsg.entry_v1); size_t hdr_size = transp.logMsg.entry.hdr_size; char* msg = (char*)&transp.logMsg + hdr_size; const char* split = NULL; if ((hdr_size < sizeof(transp.logMsg.entry_v1)) || (hdr_size > sizeof(transp.logMsg.entry))) { if (hdr_size != sizeof(transp.logMsg.entry)) { continue; } /* Check for invalid sequence number */ Loading Loading
debuggerd/libdebuggerd/tombstone.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -595,7 +595,7 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, unsigned } AndroidLogEntry e; char buf[512]; if (android_log_processBinaryLogBuffer(&log_entry.entry_v1, &e, g_eventTagMap, buf, if (android_log_processBinaryLogBuffer(&log_entry.entry, &e, g_eventTagMap, buf, sizeof(buf)) == 0) { _LOG(log, logtype::LOGS, "%s.%03d %5d %5d %c %-8.*s: %s\n", timeBuf, log_entry.entry.nsec / 1000000, log_entry.entry.pid, log_entry.entry.tid, 'I', Loading
liblog/include/log/log_read.h +4 −59 Original line number Diff line number Diff line Loading @@ -50,53 +50,9 @@ extern "C" { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wzero-length-array" /* * The userspace structure for version 1 of the logger_entry ABI. */ struct logger_entry { uint16_t len; /* length of the payload */ uint16_t __pad; /* no matter what, we get 2 bytes of padding */ int32_t pid; /* generating process's pid */ int32_t tid; /* generating process's tid */ int32_t sec; /* seconds since Epoch */ int32_t nsec; /* nanoseconds */ char msg[0]; /* the entry's payload */ }; /* * The userspace structure for version 2 of the logger_entry ABI. */ struct logger_entry_v2 { uint16_t len; /* length of the payload */ uint16_t hdr_size; /* sizeof(struct logger_entry_v2) */ int32_t pid; /* generating process's pid */ int32_t tid; /* generating process's tid */ int32_t sec; /* seconds since Epoch */ int32_t nsec; /* nanoseconds */ uint32_t euid; /* effective UID of logger */ char msg[0]; /* the entry's payload */ } __attribute__((__packed__)); /* * The userspace structure for version 3 of the logger_entry ABI. */ struct logger_entry_v3 { uint16_t len; /* length of the payload */ uint16_t hdr_size; /* sizeof(struct logger_entry_v3) */ int32_t pid; /* generating process's pid */ int32_t tid; /* generating process's tid */ int32_t sec; /* seconds since Epoch */ int32_t nsec; /* nanoseconds */ uint32_t lid; /* log id of the payload */ char msg[0]; /* the entry's payload */ } __attribute__((__packed__)); /* * The userspace structure for version 4 of the logger_entry ABI. */ struct logger_entry_v4 { uint16_t len; /* length of the payload */ uint16_t hdr_size; /* sizeof(struct logger_entry_v4) */ uint16_t hdr_size; /* sizeof(struct logger_entry) */ int32_t pid; /* generating process's pid */ uint32_t tid; /* generating process's tid */ uint32_t sec; /* seconds since Epoch */ Loading Loading @@ -124,11 +80,7 @@ struct logger_entry_v4 { struct log_msg { union { unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1]; struct logger_entry_v4 entry; struct logger_entry_v4 entry_v4; struct logger_entry_v3 entry_v3; struct logger_entry_v2 entry_v2; struct logger_entry entry_v1; struct logger_entry entry; } __attribute__((aligned(4))); #ifdef __cplusplus /* Matching log_time operators */ Loading Loading @@ -162,19 +114,12 @@ struct log_msg { } char* msg() { unsigned short hdr_size = entry.hdr_size; if (!hdr_size) { hdr_size = sizeof(entry_v1); } if ((hdr_size < sizeof(entry_v1)) || (hdr_size > sizeof(entry))) { if (hdr_size != sizeof(entry)) { return nullptr; } return reinterpret_cast<char*>(buf) + hdr_size; } unsigned int len() { return (entry.hdr_size ? entry.hdr_size : static_cast<uint16_t>(sizeof(entry_v1))) + entry.len; } unsigned int len() { return entry.hdr_size + entry.len; } #endif }; Loading
liblog/logger_read.cpp +9 −17 Original line number Diff line number Diff line Loading @@ -273,34 +273,26 @@ static int android_transport_read(struct android_log_logger_list* logger_list, struct log_msg* log_msg) { int ret = (*transp->transport->read)(logger_list, transp, log_msg); if (ret < 0) { return ret; } if (ret > (int)sizeof(*log_msg)) { ret = sizeof(*log_msg); } transp->ret = ret; /* propagate errors, or make sure len & hdr_size members visible */ if (ret < (int)(sizeof(log_msg->entry.len) + sizeof(log_msg->entry.hdr_size))) { if (ret >= (int)sizeof(log_msg->entry.len)) { log_msg->entry.len = 0; } return ret; if (ret < static_cast<int>(sizeof(log_msg->entry))) { return -EINVAL; } /* hdr_size correction (logger_entry -> logger_entry_v2+ conversion) */ if (log_msg->entry_v2.hdr_size == 0) { log_msg->entry_v2.hdr_size = sizeof(struct logger_entry); } if ((log_msg->entry_v2.hdr_size < sizeof(log_msg->entry_v1)) || (log_msg->entry_v2.hdr_size > sizeof(log_msg->entry))) { if (log_msg->entry.hdr_size != sizeof(log_msg->entry)) { return -EINVAL; } /* len validation */ if (ret <= log_msg->entry_v2.hdr_size) { log_msg->entry.len = 0; } else { log_msg->entry.len = ret - log_msg->entry_v2.hdr_size; if (log_msg->entry.len > ret - log_msg->entry.hdr_size) { return -EINVAL; } return ret; Loading
liblog/logprint.cpp +12 −33 Original line number Diff line number Diff line Loading @@ -532,18 +532,12 @@ int android_log_processLogBuffer(struct logger_entry* buf, AndroidLogEntry* entr int i; char* msg = buf->msg; struct logger_entry_v2* buf2 = (struct logger_entry_v2*)buf; if (buf2->hdr_size) { if ((buf2->hdr_size < sizeof(((struct log_msg*)NULL)->entry_v1)) || (buf2->hdr_size > sizeof(((struct log_msg*)NULL)->entry))) { if (buf->hdr_size != sizeof(struct logger_entry)) { fprintf(stderr, "+++ LOG: entry illegal hdr_size\n"); return -1; } msg = ((char*)buf2) + buf2->hdr_size; if (buf2->hdr_size >= sizeof(struct logger_entry_v4)) { entry->uid = ((struct logger_entry_v4*)buf)->uid; } } entry->uid = buf->uid; for (i = 1; i < buf->len; i++) { if (msg[i] == '\0') { if (msgStart == -1) { Loading Loading @@ -993,27 +987,15 @@ int android_log_processBinaryLogBuffer( entry->pid = buf->pid; entry->tid = buf->tid; /* * Pull the tag out, fill in some additional details based on incoming * buffer version (v3 adds lid, v4 adds uid). */ eventData = (const unsigned char*)buf->msg; struct logger_entry_v2* buf2 = (struct logger_entry_v2*)buf; if (buf2->hdr_size) { if ((buf2->hdr_size < sizeof(((struct log_msg*)NULL)->entry_v1)) || (buf2->hdr_size > sizeof(((struct log_msg*)NULL)->entry))) { if (buf->hdr_size != sizeof(struct logger_entry)) { fprintf(stderr, "+++ LOG: entry illegal hdr_size\n"); return -1; } eventData = ((unsigned char*)buf2) + buf2->hdr_size; if ((buf2->hdr_size >= sizeof(struct logger_entry_v3)) && (((struct logger_entry_v3*)buf)->lid == LOG_ID_SECURITY)) { if (buf->lid == LOG_ID_SECURITY) { entry->priority = ANDROID_LOG_WARN; } if (buf2->hdr_size >= sizeof(struct logger_entry_v4)) { entry->uid = ((struct logger_entry_v4*)buf)->uid; } } entry->uid = buf->uid; inCount = buf->len; if (inCount < sizeof(android_event_header_t)) return -1; auto* event_header = reinterpret_cast<const android_event_header_t*>(eventData); Loading Loading @@ -1069,9 +1051,6 @@ int android_log_processBinaryLogBuffer( if ((result == 1) && fmtStr) { /* We overflowed :-(, let's repaint the line w/o format dressings */ eventData = (const unsigned char*)buf->msg; if (buf2->hdr_size) { eventData = ((unsigned char*)buf2) + buf2->hdr_size; } eventData += 4; outBuf = messageBuf; outRemaining = messageBufLen - 1; Loading
liblog/pmsg_reader.cpp +14 −14 Original line number Diff line number Diff line Loading @@ -144,7 +144,7 @@ static int pmsgRead(struct android_log_logger_list* logger_list, ((logger_list->start.tv_sec != buf.l.realtime.tv_sec) || (logger_list->start.tv_nsec <= buf.l.realtime.tv_nsec)))) && (!logger_list->pid || (logger_list->pid == buf.p.pid))) { char* msg = log_msg->entry_v4.msg; char* msg = log_msg->entry.msg; *msg = buf.prio; fd = atomic_load(&transp->context.fd); if (fd <= 0) { Loading @@ -158,16 +158,16 @@ static int pmsgRead(struct android_log_logger_list* logger_list, return -EIO; } log_msg->entry_v4.len = buf.p.len - sizeof(buf) + sizeof(buf.prio); log_msg->entry_v4.hdr_size = sizeof(log_msg->entry_v4); log_msg->entry_v4.pid = buf.p.pid; log_msg->entry_v4.tid = buf.l.tid; log_msg->entry_v4.sec = buf.l.realtime.tv_sec; log_msg->entry_v4.nsec = buf.l.realtime.tv_nsec; log_msg->entry_v4.lid = buf.l.id; log_msg->entry_v4.uid = buf.p.uid; log_msg->entry.len = buf.p.len - sizeof(buf) + sizeof(buf.prio); log_msg->entry.hdr_size = sizeof(log_msg->entry); log_msg->entry.pid = buf.p.pid; log_msg->entry.tid = buf.l.tid; log_msg->entry.sec = buf.l.realtime.tv_sec; log_msg->entry.nsec = buf.l.realtime.tv_nsec; log_msg->entry.lid = buf.l.id; log_msg->entry.uid = buf.p.uid; return ret + sizeof(buf.prio) + log_msg->entry_v4.hdr_size; return ret + sizeof(buf.prio) + log_msg->entry.hdr_size; } fd = atomic_load(&transp->context.fd); Loading Loading @@ -215,7 +215,7 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref struct android_log_transport_context transp; struct content { struct listnode node; struct logger_entry_v4 entry; struct logger_entry entry; } * content; struct names { struct listnode node; Loading Loading @@ -269,12 +269,12 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref /* Read the file content */ while (pmsgRead(&logger_list, &transp, &transp.logMsg) > 0) { const char* cp; size_t hdr_size = transp.logMsg.entry.hdr_size ? transp.logMsg.entry.hdr_size : sizeof(transp.logMsg.entry_v1); size_t hdr_size = transp.logMsg.entry.hdr_size; char* msg = (char*)&transp.logMsg + hdr_size; const char* split = NULL; if ((hdr_size < sizeof(transp.logMsg.entry_v1)) || (hdr_size > sizeof(transp.logMsg.entry))) { if (hdr_size != sizeof(transp.logMsg.entry)) { continue; } /* Check for invalid sequence number */ Loading