logd: liblog: ALOG silently drops excessively long messages
Bug: 14280914
Change-Id: Idddd29784625094e54144953c29f64692a88eee9
diff --git a/liblog/logd_write.c b/liblog/logd_write.c
index 48531d5..bd36a65 100644
--- a/liblog/logd_write.c
+++ b/liblog/logd_write.c
@@ -146,9 +146,15 @@
ret = -errno;
}
} while (ret == -EINTR);
-
- return ret;
#else
+ static const unsigned header_length = 3;
+ struct iovec newVec[nr + header_length];
+ typeof_log_id_t log_id_buf;
+ uint16_t tid;
+ struct timespec ts;
+ log_time realtime_ts;
+ size_t i, payload_size;
+
if (getuid() == AID_LOGD) {
/*
* ignore log messages we send to ourself.
@@ -181,29 +187,33 @@
* };
* };
*/
- static const unsigned header_length = 3;
- struct iovec newVec[nr + header_length];
- typeof_log_id_t log_id_buf = log_id;
- uint16_t tid = gettid();
+
+ log_id_buf = log_id;
+ tid = gettid();
newVec[0].iov_base = (unsigned char *) &log_id_buf;
newVec[0].iov_len = sizeof_log_id_t;
newVec[1].iov_base = (unsigned char *) &tid;
newVec[1].iov_len = sizeof(tid);
- struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
- log_time realtime_ts;
realtime_ts.tv_sec = ts.tv_sec;
realtime_ts.tv_nsec = ts.tv_nsec;
newVec[2].iov_base = (unsigned char *) &realtime_ts;
newVec[2].iov_len = sizeof(log_time);
- size_t i;
- for (i = header_length; i < nr + header_length; i++) {
- newVec[i].iov_base = vec[i-header_length].iov_base;
- newVec[i].iov_len = vec[i-header_length].iov_len;
+ for (payload_size = 0, i = header_length; i < nr + header_length; i++) {
+ newVec[i].iov_base = vec[i - header_length].iov_base;
+ payload_size += newVec[i].iov_len = vec[i - header_length].iov_len;
+
+ if (payload_size > LOGGER_ENTRY_MAX_PAYLOAD) {
+ newVec[i].iov_len -= payload_size - LOGGER_ENTRY_MAX_PAYLOAD;
+ if (newVec[i].iov_len) {
+ ++i;
+ }
+ break;
+ }
}
/*
@@ -212,7 +222,7 @@
* ENOTCONN occurs if logd dies.
* EAGAIN occurs if logd is overloaded.
*/
- ret = writev(logd_fd, newVec, nr + header_length);
+ ret = writev(logd_fd, newVec, i);
if (ret < 0) {
ret = -errno;
if (ret == -ENOTCONN) {
@@ -234,8 +244,13 @@
}
}
}
- return ret;
+
+ if (ret > (ssize_t)(sizeof_log_id_t + sizeof(tid) + sizeof(log_time))) {
+ ret -= sizeof_log_id_t + sizeof(tid) + sizeof(log_time);
+ }
#endif
+
+ return ret;
}
#if FAKE_LOG_DEVICE