diff options
author | Nick Kralevich <nnk@google.com> | 2015-04-07 18:44:07 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-04-07 18:44:07 +0000 |
commit | 1268f227eedc99992e018656af4a954ef661afe3 (patch) | |
tree | 191bcc87ae94df501127a7e09737f92ce541d1ad | |
parent | a90dd16565218bbb37cc5da9b23c81c682985673 (diff) | |
parent | f09bfa3c14c8b5a920a98c1327c0d42f9ef9e2ca (diff) | |
download | system_core-1268f227eedc99992e018656af4a954ef661afe3.zip system_core-1268f227eedc99992e018656af4a954ef661afe3.tar.gz system_core-1268f227eedc99992e018656af4a954ef661afe3.tar.bz2 |
am f09bfa3c: am 25482963: am 5fc47aae: Merge "logd: Don\'t embed a flexible array member within another struct"
* commit 'f09bfa3c14c8b5a920a98c1327c0d42f9ef9e2ca':
logd: Don't embed a flexible array member within another struct
-rw-r--r-- | include/private/android_logger.h | 16 | ||||
-rw-r--r-- | logd/LogAudit.cpp | 6 |
2 files changed, 17 insertions, 5 deletions
diff --git a/include/private/android_logger.h b/include/private/android_logger.h index 724ca51..04238a6 100644 --- a/include/private/android_logger.h +++ b/include/private/android_logger.h @@ -70,7 +70,17 @@ typedef struct __attribute__((__packed__)) { android_event_long_t payload; } android_log_event_long_t; -/* Event payload EVENT_TYPE_STRING */ +/* + * Event payload EVENT_TYPE_STRING + * + * Danger: do not embed this structure into another structure. + * This structure uses a flexible array member, and when + * compiled using g++, __builtin_object_size(data, 1) returns + * a bad value. This is possibly a g++ bug, or a bug due to + * the fact that flexible array members are not supported + * in C++. + * http://stackoverflow.com/questions/4412749/are-flexible-array-members-valid-in-c + */ typedef struct __attribute__((__packed__)) { int8_t type; // EVENT_TYPE_STRING; int32_t length; // Little Endian Order @@ -80,7 +90,9 @@ typedef struct __attribute__((__packed__)) { /* Event with single EVENT_TYPE_STRING */ typedef struct __attribute__((__packed__)) { android_event_header_t header; - android_event_string_t payload; + int8_t type; // EVENT_TYPE_STRING; + int32_t length; // Little Endian Order + char data[]; } android_log_event_string_t; #endif diff --git a/logd/LogAudit.cpp b/logd/LogAudit.cpp index 6b3e637..bdb2915 100644 --- a/logd/LogAudit.cpp +++ b/logd/LogAudit.cpp @@ -150,9 +150,9 @@ int LogAudit::logPrint(const char *fmt, ...) { rc = -ENOMEM; } else { event->header.tag = htole32(AUDITD_LOG_TAG); - event->payload.type = EVENT_TYPE_STRING; - event->payload.length = htole32(l); - memcpy(event->payload.data, str, l); + event->type = EVENT_TYPE_STRING; + event->length = htole32(l); + memcpy(event->data, str, l); logbuf->log(LOG_ID_EVENTS, now, uid, pid, tid, reinterpret_cast<char *>(event), |