liblog: fix android_log_printLogLine empty event string

Allow _one_ empty line to get through before evaluating
further. Add __android_log_bswrite testing for content
and contentless cases; checking for propagation and for
expected printing. As for printing which is fixed here,
security variants cover the same code paths as the events.

Bug: 26646213
Change-Id: I484718aa604e0a00afde4c34a00e87468ea93aa5
This commit is contained in:
Mark Salyzyn 2016-01-20 13:52:46 -08:00
parent fb494eb40d
commit 7cc8013e37
2 changed files with 129 additions and 7 deletions

View File

@ -1488,7 +1488,7 @@ char *android_log_formatLogLine (
strcat(p, suffixBuf);
p += suffixLen;
} else {
while(pm < (entry->message + entry->messageLen)) {
do {
const char *lineStart;
size_t lineLen;
lineStart = pm;
@ -1510,7 +1510,7 @@ char *android_log_formatLogLine (
p += suffixLen;
if (*pm == '\n') pm++;
}
} while (pm < (entry->message + entry->messageLen));
}
if (p_outLength != NULL) {

View File

@ -165,6 +165,133 @@ TEST(liblog, __android_log_btwrite__android_logger_list_read) {
android_logger_list_close(logger_list);
}
static inline int32_t get4LE(const char* src)
{
return src[0] | (src[1] << 8) | (src[2] << 16) | (src[3] << 24);
}
TEST(liblog, __android_log_bswrite) {
struct logger_list *logger_list;
pid_t pid = getpid();
ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
static const char buffer[] = "Hello World";
log_time ts(android_log_clockid());
ASSERT_LT(0, __android_log_bswrite(0, buffer));
usleep(1000000);
int count = 0;
for (;;) {
log_msg log_msg;
if (android_logger_list_read(logger_list, &log_msg) <= 0) {
break;
}
ASSERT_EQ(log_msg.entry.pid, pid);
if ((log_msg.entry.sec < (ts.tv_sec - 1))
|| ((ts.tv_sec + 1) < log_msg.entry.sec)
|| (log_msg.entry.len != (4 + 1 + 4 + sizeof(buffer) - 1))
|| (log_msg.id() != LOG_ID_EVENTS)) {
continue;
}
char *eventData = log_msg.msg();
if (eventData[4] != EVENT_TYPE_STRING) {
continue;
}
int len = get4LE(eventData + 4 + 1);
if (len == (sizeof(buffer) - 1)) {
++count;
AndroidLogFormat *logformat = android_log_format_new();
EXPECT_TRUE(NULL != logformat);
AndroidLogEntry entry;
char msgBuf[1024];
EXPECT_EQ(0, android_log_processBinaryLogBuffer(&log_msg.entry_v1,
&entry,
NULL,
msgBuf,
sizeof(msgBuf)));
fflush(stderr);
EXPECT_EQ(31, android_log_printLogLine(logformat, fileno(stderr), &entry));
android_log_format_free(logformat);
}
}
EXPECT_EQ(1, count);
android_logger_list_close(logger_list);
}
TEST(liblog, __android_log_bswrite__empty_string) {
struct logger_list *logger_list;
pid_t pid = getpid();
ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
static const char buffer[] = "";
log_time ts(android_log_clockid());
ASSERT_LT(0, __android_log_bswrite(0, buffer));
usleep(1000000);
int count = 0;
for (;;) {
log_msg log_msg;
if (android_logger_list_read(logger_list, &log_msg) <= 0) {
break;
}
ASSERT_EQ(log_msg.entry.pid, pid);
if ((log_msg.entry.sec < (ts.tv_sec - 1))
|| ((ts.tv_sec + 1) < log_msg.entry.sec)
|| (log_msg.entry.len != (4 + 1 + 4))
|| (log_msg.id() != LOG_ID_EVENTS)) {
continue;
}
char *eventData = log_msg.msg();
if (eventData[4] != EVENT_TYPE_STRING) {
continue;
}
int len = get4LE(eventData + 4 + 1);
if (len == 0) {
++count;
AndroidLogFormat *logformat = android_log_format_new();
EXPECT_TRUE(NULL != logformat);
AndroidLogEntry entry;
char msgBuf[1024];
EXPECT_EQ(0, android_log_processBinaryLogBuffer(&log_msg.entry_v1,
&entry,
NULL,
msgBuf,
sizeof(msgBuf)));
fflush(stderr);
EXPECT_EQ(20, android_log_printLogLine(logformat, fileno(stderr), &entry));
android_log_format_free(logformat);
}
}
EXPECT_EQ(1, count);
android_logger_list_close(logger_list);
}
TEST(liblog, __security) {
static const char persist_key[] = "persist.logd.security";
static const char readonly_key[] = "ro.device_owner";
@ -1106,11 +1233,6 @@ TEST(liblog, is_loggable) {
property_set(key + base_offset, hold[3]);
}
static inline int32_t get4LE(const char* src)
{
return src[0] | (src[1] << 8) | (src[2] << 16) | (src[3] << 24);
}
TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__typical) {
const int TAG = 123456781;
const char SUBTAG[] = "test-subtag";