summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2015-04-07 18:44:07 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-04-07 18:44:07 +0000
commit1268f227eedc99992e018656af4a954ef661afe3 (patch)
tree191bcc87ae94df501127a7e09737f92ce541d1ad
parenta90dd16565218bbb37cc5da9b23c81c682985673 (diff)
parentf09bfa3c14c8b5a920a98c1327c0d42f9ef9e2ca (diff)
downloadsystem_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.h16
-rw-r--r--logd/LogAudit.cpp6
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),