Merge "liblog: check loggability before formatting" am: 929c9e8b40 am: 82b6e55054 am: 20a73a8424
Change-Id: I63fcf1967c78e7d6b6f8d0f8bb83115e0f2cf1ce
diff --git a/liblog/fake_log_device.cpp b/liblog/fake_log_device.cpp
index f1147dc..cd4c11e 100644
--- a/liblog/fake_log_device.cpp
+++ b/liblog/fake_log_device.cpp
@@ -516,13 +516,12 @@
memset(&log_state, 0, sizeof(log_state));
}
-int __android_log_is_loggable(int prio, const char*, int def) {
+int __android_log_is_loggable(int prio, const char*, int) {
int minimum_priority = __android_log_get_minimum_priority();
if (minimum_priority == ANDROID_LOG_DEFAULT) {
- return prio >= def;
- } else {
- return prio >= minimum_priority;
+ minimum_priority = ANDROID_LOG_INFO;
}
+ return prio >= minimum_priority;
}
int __android_log_is_loggable_len(int prio, const char*, size_t, int def) {
diff --git a/liblog/include/android/log.h b/liblog/include/android/log.h
index 6530704..00aafaa 100644
--- a/liblog/include/android/log.h
+++ b/liblog/include/android/log.h
@@ -194,6 +194,10 @@
* Writes the log message specified with logger_data and msg to the log. logger_data includes
* additional file name and line number information that a logger may use. logger_data is versioned
* for backwards compatibility.
+ * This assumes that loggability has already been checked through __android_log_is_loggable().
+ * Higher level logging libraries, such as libbase, first check loggability, then format their
+ * buffers, then pass the message to liblog via this function, and therefore we do not want to
+ * duplicate the loggability check here.
*/
void __android_log_write_logger_data(struct __android_logger_data* logger_data, const char* msg);
diff --git a/liblog/logger_write.cpp b/liblog/logger_write.cpp
index 61b6fce..1783854 100644
--- a/liblog/logger_write.cpp
+++ b/liblog/logger_write.cpp
@@ -185,15 +185,6 @@
errno = save_errno;
return -EINVAL;
}
- } else {
- int prio = *static_cast<int*>(vec[0].iov_base);
- const char* tag = static_cast<const char*>(vec[1].iov_base);
- size_t len = vec[1].iov_len;
-
- if (!__android_log_is_loggable_len(prio, tag, len - 1, ANDROID_LOG_VERBOSE)) {
- errno = save_errno;
- return -EPERM;
- }
}
ret = LogdWrite(log_id, &ts, vec, nr);
@@ -292,20 +283,35 @@
}
int __android_log_buf_write(int bufID, int prio, const char* tag, const char* msg) {
+ if (!__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE)) {
+ return 0;
+ }
+
__android_logger_data logger_data = {sizeof(__android_logger_data), bufID, prio, tag, nullptr, 0};
__android_log_write_logger_data(&logger_data, msg);
return 1;
}
int __android_log_vprint(int prio, const char* tag, const char* fmt, va_list ap) {
+ if (!__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE)) {
+ return 0;
+ }
+
char buf[LOG_BUF_SIZE];
vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
- return __android_log_write(prio, tag, buf);
+ __android_logger_data logger_data = {
+ sizeof(__android_logger_data), LOG_ID_MAIN, prio, tag, nullptr, 0};
+ __android_log_write_logger_data(&logger_data, buf);
+ return 1;
}
int __android_log_print(int prio, const char* tag, const char* fmt, ...) {
+ if (!__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE)) {
+ return 0;
+ }
+
va_list ap;
char buf[LOG_BUF_SIZE];
@@ -313,10 +319,17 @@
vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
va_end(ap);
- return __android_log_write(prio, tag, buf);
+ __android_logger_data logger_data = {
+ sizeof(__android_logger_data), LOG_ID_MAIN, prio, tag, nullptr, 0};
+ __android_log_write_logger_data(&logger_data, buf);
+ return 1;
}
int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fmt, ...) {
+ if (!__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE)) {
+ return 0;
+ }
+
va_list ap;
char buf[LOG_BUF_SIZE];
@@ -324,7 +337,9 @@
vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
va_end(ap);
- return __android_log_buf_write(bufID, prio, tag, buf);
+ __android_logger_data logger_data = {sizeof(__android_logger_data), bufID, prio, tag, nullptr, 0};
+ __android_log_write_logger_data(&logger_data, buf);
+ return 1;
}
void __android_log_assert(const char* cond, const char* tag, const char* fmt, ...) {