Merge "liblog: always restore errno in logging functions"
am: 077839ab23
Change-Id: Iae9738f2c6b7df4ed30681432489a470b2051b5f
diff --git a/liblog/logger_write.cpp b/liblog/logger_write.cpp
index 3733357..ca68296 100644
--- a/liblog/logger_write.cpp
+++ b/liblog/logger_write.cpp
@@ -29,6 +29,7 @@
#include <shared_mutex>
+#include <android-base/errno_restorer.h>
#include <android-base/macros.h>
#include <private/android_filesystem_config.h>
#include <private/android_logger.h>
@@ -54,6 +55,8 @@
#include <windows.h>
#endif
+using android::base::ErrnoRestorer;
+
#define LOG_BUF_SIZE 1024
#if defined(__ANDROID__)
@@ -196,11 +199,9 @@
#ifdef __ANDROID__
static int write_to_log(log_id_t log_id, struct iovec* vec, size_t nr) {
- int ret, save_errno;
+ int ret;
struct timespec ts;
- save_errno = errno;
-
if (log_id == LOG_ID_KERNEL) {
return -EINVAL;
}
@@ -209,23 +210,19 @@
if (log_id == LOG_ID_SECURITY) {
if (vec[0].iov_len < 4) {
- errno = save_errno;
return -EINVAL;
}
ret = check_log_uid_permissions();
if (ret < 0) {
- errno = save_errno;
return ret;
}
if (!__android_log_security()) {
/* If only we could reset downstream logd counter */
- errno = save_errno;
return -EPERM;
}
} else if (log_id == LOG_ID_EVENTS || log_id == LOG_ID_STATS) {
if (vec[0].iov_len < 4) {
- errno = save_errno;
return -EINVAL;
}
}
@@ -233,7 +230,6 @@
ret = LogdWrite(log_id, &ts, vec, nr);
PmsgWrite(log_id, &ts, vec, nr);
- errno = save_errno;
return ret;
}
#else
@@ -313,6 +309,8 @@
}
void __android_log_write_logger_data(__android_logger_data* logger_data, const char* msg) {
+ ErrnoRestorer errno_restorer;
+
auto tag_lock = std::shared_lock{default_tag_lock, std::defer_lock};
if (logger_data->tag == nullptr) {
tag_lock.lock();
@@ -330,6 +328,8 @@
}
int __android_log_buf_write(int bufID, int prio, const char* tag, const char* msg) {
+ ErrnoRestorer errno_restorer;
+
if (!__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE)) {
return 0;
}
@@ -340,6 +340,8 @@
}
int __android_log_vprint(int prio, const char* tag, const char* fmt, va_list ap) {
+ ErrnoRestorer errno_restorer;
+
if (!__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE)) {
return 0;
}
@@ -355,6 +357,8 @@
}
int __android_log_print(int prio, const char* tag, const char* fmt, ...) {
+ ErrnoRestorer errno_restorer;
+
if (!__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE)) {
return 0;
}
@@ -373,6 +377,8 @@
}
int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fmt, ...) {
+ ErrnoRestorer errno_restorer;
+
if (!__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE)) {
return 0;
}
@@ -419,6 +425,8 @@
}
int __android_log_bwrite(int32_t tag, const void* payload, size_t len) {
+ ErrnoRestorer errno_restorer;
+
struct iovec vec[2];
vec[0].iov_base = &tag;
@@ -430,6 +438,8 @@
}
int __android_log_stats_bwrite(int32_t tag, const void* payload, size_t len) {
+ ErrnoRestorer errno_restorer;
+
struct iovec vec[2];
vec[0].iov_base = &tag;
@@ -441,6 +451,8 @@
}
int __android_log_security_bwrite(int32_t tag, const void* payload, size_t len) {
+ ErrnoRestorer errno_restorer;
+
struct iovec vec[2];
vec[0].iov_base = &tag;
@@ -457,6 +469,8 @@
* handy if we just want to dump an integer into the log.
*/
int __android_log_btwrite(int32_t tag, char type, const void* payload, size_t len) {
+ ErrnoRestorer errno_restorer;
+
struct iovec vec[3];
vec[0].iov_base = &tag;
@@ -474,6 +488,8 @@
* event log.
*/
int __android_log_bswrite(int32_t tag, const char* payload) {
+ ErrnoRestorer errno_restorer;
+
struct iovec vec[4];
char type = EVENT_TYPE_STRING;
uint32_t len = strlen(payload);
@@ -495,6 +511,8 @@
* security log.
*/
int __android_log_security_bswrite(int32_t tag, const char* payload) {
+ ErrnoRestorer errno_restorer;
+
struct iovec vec[4];
char type = EVENT_TYPE_STRING;
uint32_t len = strlen(payload);