From 454380382312014da27fcd5bd2a2adc6770693db Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 6 Dec 2021 18:58:19 +0000 Subject: [PATCH] Crash log: Increase crash log length limit on Unix Allocate buffer using mmap if possible --- src/crashlog.cpp | 11 ++++++++--- src/crashlog.h | 3 ++- src/os/unix/crashlog_unix.cpp | 9 ++++++++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 9b0cbc9b52..547ecd7523 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -696,7 +696,7 @@ bool CrashLog::WriteScreenshot(char *filename, const char *filename_last, const * information like paths to the console. * @return true when everything is made successfully. */ -bool CrashLog::MakeCrashLog() +bool CrashLog::MakeCrashLog(char *buffer, const char *last) { /* Don't keep looping logging crashes. */ static bool crashlogged = false; @@ -708,7 +708,6 @@ bool CrashLog::MakeCrashLog() } char filename[MAX_PATH]; - char buffer[65536 * 4]; bool ret = true; char *name_buffer_date = this->name_buffer + seprintf(this->name_buffer, lastof(this->name_buffer), "crash-"); @@ -716,7 +715,7 @@ bool CrashLog::MakeCrashLog() strftime(name_buffer_date, lastof(this->name_buffer) - name_buffer_date, "%Y%m%dT%H%M%SZ", gmtime(&cur_time)); printf("Crash encountered, generating crash log...\n"); - this->FillCrashLog(buffer, lastof(buffer)); + this->FillCrashLog(buffer, last); printf("%s\n", buffer); printf("Crash log generated.\n\n"); @@ -752,6 +751,12 @@ bool CrashLog::MakeCrashLog() return ret; } +bool CrashLog::MakeCrashLogWithStackBuffer() +{ + char buffer[65536 * 4]; + return this->MakeCrashLog(buffer, lastof(buffer)); +} + /** * Makes a desync crash log, writes it to a file and then subsequently tries * to make a crash savegame. It uses DEBUG to write diff --git a/src/crashlog.h b/src/crashlog.h index dfbd7a02bd..86116c0055 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -152,7 +152,8 @@ public: bool WriteSavegame(char *filename, const char *filename_last, const char *name = "crash") const; bool WriteScreenshot(char *filename, const char *filename_last, const char *name = "crash") const; - bool MakeCrashLog(); + bool MakeCrashLog(char *buffer, const char *last); + bool MakeCrashLogWithStackBuffer(); bool MakeDesyncCrashLog(const std::string *log_in, std::string *log_out, const DesyncExtraInfo &info) const; bool MakeInconsistencyLog(const InconsistencyExtraInfo &info) const; bool MakeVersionInfoLog() const; diff --git a/src/os/unix/crashlog_unix.cpp b/src/os/unix/crashlog_unix.cpp index bfaee844d0..69290539eb 100644 --- a/src/os/unix/crashlog_unix.cpp +++ b/src/os/unix/crashlog_unix.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #if defined(WITH_DBG_GDB) #include @@ -585,7 +586,13 @@ static void CDECL HandleCrash(int signum) #else CrashLogUnix log(signum); #endif - log.MakeCrashLog(); + const size_t length = 65536 * 16; + char *buffer = (char *)mmap(nullptr, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (buffer != MAP_FAILED) { + log.MakeCrashLog(buffer, buffer + length - 1); + } else { + log.MakeCrashLogWithStackBuffer(); + } CrashLog::AfterCrashLogCleanup(); abort();