summaryrefslogtreecommitdiffstats
path: root/include/private
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2015-04-07 01:25:43 -0700
committerNick Kralevich <nnk@google.com>2015-04-07 10:12:20 -0700
commit58ba58a97c8ec56b2c2a32d6cda19a3a57e3cccf (patch)
tree3baecc8da119c90754d6de6f6f4d63da5c7c39db /include/private
parent02f1d80ae2da2436c4c2e2a4643866871f41d54f (diff)
downloadsystem_core-58ba58a97c8ec56b2c2a32d6cda19a3a57e3cccf.zip
system_core-58ba58a97c8ec56b2c2a32d6cda19a3a57e3cccf.tar.gz
system_core-58ba58a97c8ec56b2c2a32d6cda19a3a57e3cccf.tar.bz2
logd: Don't embed a flexible array member within another struct
C (but not C++) has a concept of a flexible array member, which is documented at https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html . Using a flexible array member indicates that the structure is really a header for a variable length object. In logd's case, the variable length structure android_event_string_t was embedded within another structure called android_log_event_string_t. This makes gcc's __builtin_object_size() function really confused. When compiling with C++, __builtin_object_size(android_log_event_string_t.payload.data, 1) would return 0, whereas if you compiled the code with C, the same call would (properly) return -1. Code which does automatic bounds checking, such as the proposed patch at https://android-review.googlesource.com/145411 , will cause problems for logd if this syntax is used. Don't try to embed a variable length structure within another structure. This doesn't appear to be valid C nor C++, and while it's worked, it seems problematic. Instead, inline the structure so it's one big happy structure. Change-Id: I8ac02b7142a4f6560f5f80df2effcf720f9896fc
Diffstat (limited to 'include/private')
-rw-r--r--include/private/android_logger.h16
1 files changed, 14 insertions, 2 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