From 71780b4b70273c499802cc531482450ea043334b Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 2 Sep 2021 22:23:38 +0800 Subject: [PATCH] [core] Create log dir when it was deleted (#1037) --- core/src/main/cpp/daemon/logcat.cpp | 33 +++++++++++-------- .../lspd/service/ConfigFileManager.java | 6 ++-- .../lsposed/lspd/service/LogcatService.java | 16 +++------ 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/core/src/main/cpp/daemon/logcat.cpp b/core/src/main/cpp/daemon/logcat.cpp index 47b91853..fb6dc520 100644 --- a/core/src/main/cpp/daemon/logcat.cpp +++ b/core/src/main/cpp/daemon/logcat.cpp @@ -46,7 +46,7 @@ private: void ProcessBuffer(struct log_msg *buf); - static int PrintLogLine(const AndroidLogEntry &entry, FILE *out); + static size_t PrintLogLine(const AndroidLogEntry &entry, FILE *out); JNIEnv *env_; jobject thiz_; @@ -63,7 +63,7 @@ private: bool verbose_ = true; }; -int Logcat::PrintLogLine(const AndroidLogEntry &entry, FILE *out) { +size_t Logcat::PrintLogLine(const AndroidLogEntry &entry, FILE *out) { if (!out) return 0; constexpr static size_t kMaxTimeBuff = 64; struct tm tm{}; @@ -81,6 +81,8 @@ int Logcat::PrintLogLine(const AndroidLogEntry &entry, FILE *out) { } localtime_r(&now, &tm); strftime(time_buff.data(), time_buff.size(), "%Y-%m-%dT%H:%M:%S", &tm); + // implicitly convert to size_t and intentionally trigger overflow when failed + // to generate a new fd return fprintf(out, "[ %s.%03ld %8d:%6d:%6d %c/%-15.*s ] %.*s\n", time_buff.data(), nsec / MS_PER_NSEC, @@ -142,12 +144,12 @@ void Logcat::ProcessBuffer(struct log_msg *buf) { void Logcat::Run() { constexpr size_t tail_after_crash = 10U; - constexpr size_t kMaxRestartLogdWait = 1024U; + constexpr size_t max_restart_logd_wait = 1U << 10; size_t tail = 0; RefreshFd(true); RefreshFd(false); - size_t logd_crash_times = 0; - size_t logd_restart_wait = 8; + size_t logd_crash_count = 0; + size_t logd_restart_wait = 1 << 3; while (true) { std::unique_ptr logger_list{ android_logger_list_alloc(0, tail, 0), &android_logger_list_free}; @@ -172,15 +174,20 @@ void Logcat::Run() { if (verbose_print_count_ >= kMaxLogSize) [[unlikely]] RefreshFd(true); if (modules_print_count_ >= kMaxLogSize) [[unlikely]] RefreshFd(false); } - logd_crash_times++; - if (logd_crash_times >= logd_restart_wait) { - fprintf(verbose_file_.get(), "\nLogd crashed too many times, trying mannually start...\n"); - fprintf(modules_file_.get(), "\nLogd crashed too many times, trying mannually start...\n"); - __system_property_set("ctl.restart", "logd"); - if (logd_restart_wait < kMaxRestartLogdWait) logd_restart_wait *= 2; - else logd_crash_times = 0; + logd_crash_count++; + if (logd_crash_count >= logd_restart_wait) { + fprintf(verbose_file_.get(), + "\nLogd crashed too many times, trying manually start...\n"); + fprintf(modules_file_.get(), + "\nLogd crashed too many times, trying manually start...\n"); + __system_property_set("ctl.restart", "logd"); + if (logd_restart_wait < max_restart_logd_wait) { + logd_restart_wait <<= 1; + } else { + logd_crash_count = 0; + } } - + fprintf(verbose_file_.get(), "\nLogd maybe crashed, retrying in 1s...\n"); fprintf(modules_file_.get(), "\nLogd maybe crashed, retrying in 1s...\n"); sleep(1); diff --git a/core/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java b/core/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java index fa8cedd6..fde32166 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java +++ b/core/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java @@ -90,11 +90,13 @@ class ConfigFileManager { return prefix + "_" + formatter.format(Instant.now()) + ".txt"; } - static File getNewVerboseLogPath() { + static File getNewVerboseLogPath() throws IOException { + Files.createDirectories(logDirPath); return logDirPath.resolve(getNewLogFileName("verbose")).toFile(); } - static File getNewModulesLogPath() { + static File getNewModulesLogPath() throws IOException { + Files.createDirectories(logDirPath); return logDirPath.resolve(getNewLogFileName("modules")).toFile(); } diff --git a/core/src/main/java/org/lsposed/lspd/service/LogcatService.java b/core/src/main/java/org/lsposed/lspd/service/LogcatService.java index 6630b4ca..143a2ad9 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LogcatService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LogcatService.java @@ -35,17 +35,11 @@ public class LogcatService implements Runnable { @SuppressWarnings("unused") private int refreshFd(boolean isVerboseLog) { - File log; - if (isVerboseLog) { - verboseLog = ConfigFileManager.getNewVerboseLogPath(); - log = verboseLog; - } else { - modulesLog = ConfigFileManager.getNewModulesLogPath(); - log = modulesLog; - } - try (var fd = ParcelFileDescriptor.open(log, mode)) { - Log.i(TAG, "New " + (isVerboseLog ? "verbose log" : "modules log") + " file: " + log); - return fd.detachFd(); + try { + File log = isVerboseLog ? (verboseLog = ConfigFileManager.getNewVerboseLogPath()) : + (modulesLog = ConfigFileManager.getNewModulesLogPath()); + Log.i(TAG, "New " + (isVerboseLog ? "verbose" : "modules") + " log file: " + log); + return ParcelFileDescriptor.open(log, mode).detachFd(); } catch (IOException e) { Log.w(TAG, "someone chattr +i ?", e); return -1;