diff --git a/lib/Logging/Logging.cpp b/lib/Logging/Logging.cpp index 0de1adf6..a050ffe4 100644 --- a/lib/Logging/Logging.cpp +++ b/lib/Logging/Logging.cpp @@ -80,6 +80,12 @@ std::string getLastLogs() { return output; } +void sanitizeLogHead() { + if (logHead >= MAX_LOG_LINES) { + logHead = 0; + } +} + void clearLastLogs() { for (size_t i = 0; i < MAX_LOG_LINES; i++) { logMessages[i][0] = '\0'; diff --git a/lib/Logging/Logging.h b/lib/Logging/Logging.h index 83cabdc1..fc2d9d37 100644 --- a/lib/Logging/Logging.h +++ b/lib/Logging/Logging.h @@ -57,6 +57,9 @@ void logPrintf(const char* level, const char* origin, const char* format, ...); std::string getLastLogs(); void clearLastLogs(); +// Clamps logHead into range without wiping messages — safe to call on panic +// reboots where the panic occurred before begin() ever had a chance to run. +void sanitizeLogHead(); class MySerialImpl : public Print { public: diff --git a/lib/hal/HalSystem.cpp b/lib/hal/HalSystem.cpp index 606bf80d..dfe8055d 100644 --- a/lib/hal/HalSystem.cpp +++ b/lib/hal/HalSystem.cpp @@ -76,6 +76,10 @@ void begin() { // `clearPanic()` to clear it after dumping if (!isRebootFromPanic()) { clearPanic(); + } else { + // Panic reboot: preserve logs and panic info, but clamp logHead in case the + // panic occurred before begin() ever ran (e.g. in a static constructor). + sanitizeLogHead(); } }