diff options
author | Kenny Root <kroot@google.com> | 2011-09-30 17:10:14 -0700 |
---|---|---|
committer | Kenny Root <kroot@google.com> | 2011-10-03 14:14:41 -0700 |
commit | 4bf3c02e026077d14a4512c7c2f71937da3c2d50 (patch) | |
tree | 7fd7c515c75cc0f64d9be5351be46f7d767e5794 | |
parent | e5de9ee4915bafd7f31a96260613d8b93aba8351 (diff) | |
download | system_core-4bf3c02e026077d14a4512c7c2f71937da3c2d50.zip system_core-4bf3c02e026077d14a4512c7c2f71937da3c2d50.tar.gz system_core-4bf3c02e026077d14a4512c7c2f71937da3c2d50.tar.bz2 |
Add checking for log entry format
The log tag may be zero length if corrupted, so check for this
condition.
Change-Id: I7616226dabe78a85859b0ab53aca08f734dbdd84
-rw-r--r-- | liblog/logprint.c | 20 | ||||
-rw-r--r-- | logcat/logcat.cpp | 6 |
2 files changed, 19 insertions, 7 deletions
diff --git a/liblog/logprint.c b/liblog/logprint.c index 4c5b3e5..59fed9b 100644 --- a/liblog/logprint.c +++ b/liblog/logprint.c @@ -350,16 +350,28 @@ static inline char * strip_end(char *str) int android_log_processLogBuffer(struct logger_entry *buf, AndroidLogEntry *entry) { - size_t tag_len; - entry->tv_sec = buf->sec; entry->tv_nsec = buf->nsec; entry->priority = buf->msg[0]; entry->pid = buf->pid; entry->tid = buf->tid; + + /* + * format: <priority:1><tag:N>\0<message:N>\0 + * + * tag str + * starts at msg+1 + * msg + * starts at msg+1+len(tag)+1 + */ entry->tag = buf->msg + 1; - tag_len = strlen(entry->tag); - entry->messageLen = buf->len - tag_len - 3; + const size_t tag_len = strlen(entry->tag); + const size_t preambleAndNullLen = tag_len + 3; + if (buf->len <= preambleAndNullLen) { + fprintf(stderr, "+++ LOG: entry corrupt or truncated\n"); + return -1; + } + entry->messageLen = buf->len - preambleAndNullLen; entry->message = entry->tag + tag_len + 1; return 0; diff --git a/logcat/logcat.cpp b/logcat/logcat.cpp index 96b68ef..4cd2151 100644 --- a/logcat/logcat.cpp +++ b/logcat/logcat.cpp @@ -323,7 +323,7 @@ static void readLogLines(log_device_t* devices) // the caller requested to just dump the log and exit if (g_nonblock) { - exit(0); + return; } } else { // print all that aren't the last in their list @@ -765,10 +765,10 @@ int main(int argc, char **argv) } if (getLogSize) { - return 0; + exit(0); } if (clearLog) { - return 0; + exit(0); } //LOG_EVENT_INT(10, 12345); |