From 90c672fc6dd141eefc2860ad8d633744dcddcbd5 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 6 Dec 2021 18:55:31 +0000 Subject: [PATCH] Crash log: Increase length limit for desync/inconsistency logs Allocate buffer instead of using stack --- src/crashlog.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 6b17bfad35..9b0cbc9b52 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -32,6 +32,7 @@ #include "thread.h" #include "debug_desync.h" #include "event_logs.h" +#include "scope.h" #include "ai/ai_info.hpp" #include "game/game.hpp" @@ -760,7 +761,14 @@ bool CrashLog::MakeCrashLog() bool CrashLog::MakeDesyncCrashLog(const std::string *log_in, std::string *log_out, const DesyncExtraInfo &info) const { char filename[MAX_PATH]; - char buffer[65536 * 2]; + + const size_t length = 65536 * 16; + char * const buffer = MallocT(length); + auto guard = scope_guard([=]() { + free(buffer); + }); + const char * const last = buffer + length - 1; + bool ret = true; const char *mode = _network_server ? "server" : "client"; @@ -771,13 +779,13 @@ bool CrashLog::MakeDesyncCrashLog(const std::string *log_in, std::string *log_ou strftime(name_buffer_date, lastof(name_buffer) - name_buffer_date, "%Y%m%dT%H%M%SZ", gmtime(&cur_time)); printf("Desync encountered (%s), generating desync log...\n", mode); - char *b = this->FillDesyncCrashLog(buffer, lastof(buffer), info); + char *b = this->FillDesyncCrashLog(buffer, last, info); if (log_out) log_out->assign(buffer); if (log_in && !log_in->empty()) { - b = strecpy(b, "\n", lastof(buffer), true); - b = strecpy(b, log_in->c_str(), lastof(buffer), true); + b = strecpy(b, "\n", last, true); + b = strecpy(b, log_in->c_str(), last, true); } bool bret = this->WriteCrashLog(buffer, filename, lastof(filename), name_buffer, info.log_file); @@ -824,7 +832,14 @@ bool CrashLog::MakeDesyncCrashLog(const std::string *log_in, std::string *log_ou bool CrashLog::MakeInconsistencyLog(const InconsistencyExtraInfo &info) const { char filename[MAX_PATH]; - char buffer[65536 * 2]; + + const size_t length = 65536 * 16; + char * const buffer = MallocT(length); + auto guard = scope_guard([=]() { + free(buffer); + }); + const char * const last = buffer + length - 1; + bool ret = true; char name_buffer[64]; @@ -833,7 +848,7 @@ bool CrashLog::MakeInconsistencyLog(const InconsistencyExtraInfo &info) const strftime(name_buffer_date, lastof(name_buffer) - name_buffer_date, "%Y%m%dT%H%M%SZ", gmtime(&cur_time)); printf("Inconsistency encountered, generating diagnostics log...\n"); - this->FillInconsistencyLog(buffer, lastof(buffer), info); + this->FillInconsistencyLog(buffer, last, info); bool bret = this->WriteCrashLog(buffer, filename, lastof(filename), name_buffer); if (bret) {