liblog: save errno through log writing

Test: compile
Bug: 74258013
Change-Id: I5163527826855bc506ed324aaba47f8695aaf668
This commit is contained in:
Mark Salyzyn 2018-03-07 10:42:06 -08:00
parent 5be32c312c
commit 72d3724ee5
1 changed files with 15 additions and 4 deletions

View File

@ -243,7 +243,7 @@ static inline uint32_t get4LE(const uint8_t* src) {
static int __write_to_log_daemon(log_id_t log_id, struct iovec* vec, size_t nr) {
struct android_log_transport_write* node;
int ret;
int ret, save_errno;
struct timespec ts;
size_t len, i;
@ -254,20 +254,24 @@ static int __write_to_log_daemon(log_id_t log_id, struct iovec* vec, size_t nr)
return -EINVAL;
}
save_errno = errno;
#if defined(__ANDROID__)
clock_gettime(android_log_clockid(), &ts);
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) {
@ -276,6 +280,7 @@ static int __write_to_log_daemon(log_id_t log_id, struct iovec* vec, size_t nr)
EventTagMap *m, *f;
if (vec[0].iov_len < 4) {
errno = save_errno;
return -EINVAL;
}
@ -311,6 +316,7 @@ static int __write_to_log_daemon(log_id_t log_id, struct iovec* vec, size_t nr)
android_closeEventTagMap(f);
}
if (!ret) {
errno = save_errno;
return -EPERM;
}
} else {
@ -340,6 +346,7 @@ static int __write_to_log_daemon(log_id_t log_id, struct iovec* vec, size_t nr)
}
if (!__android_log_is_loggable_len(prio, tag, len - 1, ANDROID_LOG_VERBOSE)) {
errno = save_errno;
return -EPERM;
}
}
@ -371,21 +378,23 @@ static int __write_to_log_daemon(log_id_t log_id, struct iovec* vec, size_t nr)
}
}
errno = save_errno;
return ret;
}
static int __write_to_log_init(log_id_t log_id, struct iovec* vec, size_t nr) {
int ret, save_errno = errno;
__android_log_lock();
if (write_to_log == __write_to_log_init) {
int ret;
ret = __write_to_log_initialize();
if (ret < 0) {
__android_log_unlock();
if (!list_empty(&__android_log_persist_write)) {
__write_to_log_daemon(log_id, vec, nr);
}
errno = save_errno;
return ret;
}
@ -394,7 +403,9 @@ static int __write_to_log_init(log_id_t log_id, struct iovec* vec, size_t nr) {
__android_log_unlock();
return write_to_log(log_id, vec, nr);
ret = write_to_log(log_id, vec, nr);
errno = save_errno;
return ret;
}
LIBLOG_ABI_PUBLIC int __android_log_write(int prio, const char* tag,