From 57c1f4dce227a5c8d9526baa5b3f79b505131cf1 Mon Sep 17 00:00:00 2001 From: Adam Bird Date: Wed, 2 Nov 2022 09:37:44 -0400 Subject: [PATCH] Fix rando save creation crash due to corrupted hint text (#1846) --- soh/soh/Enhancements/randomizer/randomizer.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 26393d73b..6f86b5645 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -958,25 +958,31 @@ void Randomizer::ParseHintLocationsFile(const char* spoilerFileName) { bool success = false; + // Have all these use strncpy so that the null terminator is copied + // and also set the last index to null for safety try { json spoilerFileJson; spoilerFileStream >> spoilerFileJson; std::string childAltarJsonText = spoilerFileJson["childAltarText"].get(); std::string formattedChildAltarText = FormatJsonHintText(childAltarJsonText); - memcpy(gSaveContext.childAltarText, formattedChildAltarText.c_str(), formattedChildAltarText.length()); + strncpy(gSaveContext.childAltarText, formattedChildAltarText.c_str(), sizeof(gSaveContext.childAltarText) - 1); + gSaveContext.childAltarText[sizeof(gSaveContext.childAltarText) - 1] = 0; std::string adultAltarJsonText = spoilerFileJson["adultAltarText"].get(); std::string formattedAdultAltarText = FormatJsonHintText(adultAltarJsonText); - memcpy(gSaveContext.adultAltarText, formattedAdultAltarText.c_str(), formattedAdultAltarText.length()); + strncpy(gSaveContext.adultAltarText, formattedAdultAltarText.c_str(), sizeof(gSaveContext.adultAltarText) - 1); + gSaveContext.adultAltarText[sizeof(gSaveContext.adultAltarText) - 1] = 0; std::string ganonHintJsonText = spoilerFileJson["ganonHintText"].get(); std::string formattedGanonHintJsonText = FormatJsonHintText(ganonHintJsonText); - memcpy(gSaveContext.ganonHintText, formattedGanonHintJsonText.c_str(), formattedGanonHintJsonText.length()); + strncpy(gSaveContext.ganonHintText, formattedGanonHintJsonText.c_str(), sizeof(gSaveContext.ganonHintText) - 1); + gSaveContext.ganonHintText[sizeof(gSaveContext.ganonHintText) - 1] = 0; std::string ganonJsonText = spoilerFileJson["ganonText"].get(); std::string formattedGanonJsonText = FormatJsonHintText(ganonJsonText); - memcpy(gSaveContext.ganonText, formattedGanonJsonText.c_str(), formattedGanonJsonText.length()); + strncpy(gSaveContext.ganonText, formattedGanonJsonText.c_str(), sizeof(gSaveContext.ganonText) - 1); + gSaveContext.ganonText[sizeof(gSaveContext.ganonText) - 1] = 0; json hintsJson = spoilerFileJson["hints"]; int index = 0; @@ -984,7 +990,9 @@ void Randomizer::ParseHintLocationsFile(const char* spoilerFileName) { gSaveContext.hintLocations[index].check = SpoilerfileCheckNameToEnum[it.key()]; std::string hintMessage = FormatJsonHintText(it.value()); - memcpy(gSaveContext.hintLocations[index].hintText, hintMessage.c_str(), hintMessage.length()); + size_t maxHintTextSize = sizeof(gSaveContext.hintLocations[index].hintText); + strncpy(gSaveContext.hintLocations[index].hintText, hintMessage.c_str(), maxHintTextSize - 1); + gSaveContext.hintLocations[index].hintText[maxHintTextSize - 1] = 0; index++; }