From c62dfc1bcc9b98978ab33abdf0e874ceeab10cac Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 6 Dec 2020 23:09:24 -0800 Subject: [PATCH] Make logging less error prone --- native/jni/core/daemon.cpp | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/native/jni/core/daemon.cpp b/native/jni/core/daemon.cpp index b27fa0d1b..6e2828d57 100644 --- a/native/jni/core/daemon.cpp +++ b/native/jni/core/daemon.cpp @@ -134,31 +134,32 @@ shortcut: close(client); } -static FILE *log_file; +static shared_ptr log_file; -bool in_mem_log = true; +atomic_flag file_backed = ATOMIC_FLAG_INIT; static char *log_buf; static size_t log_buf_len; void setup_logfile(bool reset) { - if (!in_mem_log) + if (file_backed.test_and_set(memory_order_relaxed)) return; - in_mem_log = false; if (reset) rename(LOGFILE, LOGFILE ".bak"); int fd = xopen(LOGFILE, O_WRONLY | O_APPEND | O_CREAT | O_CLOEXEC, 0644); - - // Dump all logs in memory (if exists) - if (log_buf) { - write(fd, log_buf, log_buf_len); + if (fd < 0) { + log_file.reset(); + return; } - // Redirect to log file - log_file = fdopen(fd, "a"); - setbuf(log_file, nullptr); + // Dump all logs in memory (if exists) + if (log_buf) + write(fd, log_buf, log_buf_len); - free(log_buf); + if (FILE *fp = fdopen(fd, "a")) { + setbuf(fp, nullptr); + log_file.reset(fp, &fclose); + } } static int magisk_log(int prio, const char *fmt, va_list ap) { @@ -168,6 +169,10 @@ static int magisk_log(int prio, const char *fmt, va_list ap) { // Log to logcat __android_log_vprint(prio, "Magisk", fmt, ap); + auto local_log_file = log_file; + if (!local_log_file) + return 0; + char buf[4096]; timeval tv; tm tm; @@ -192,11 +197,15 @@ static int magisk_log(int prio, const char *fmt, va_list ap) { int ms = tv.tv_usec / 1000; len += sprintf(buf + len, ".%03d %c : ", ms, type); strcpy(buf + len, fmt); - return vfprintf(log_file, buf, args); + return vfprintf(local_log_file.get(), buf, args); } static void android_logging() { - log_file = make_stream_fp(log_buf, log_buf_len).release(); + auto in_mem_file = make_stream_fp(log_buf, log_buf_len); + log_file.reset(in_mem_file.release(), [](FILE *) { + free(log_buf); + log_buf = nullptr; + }); log_cb.d = [](auto fmt, auto ap){ return magisk_log(ANDROID_LOG_DEBUG, fmt, ap); }; log_cb.i = [](auto fmt, auto ap){ return magisk_log(ANDROID_LOG_INFO, fmt, ap); }; log_cb.w = [](auto fmt, auto ap){ return magisk_log(ANDROID_LOG_WARN, fmt, ap); };