Fix rando save creation crash due to corrupted hint text (#1846)

This commit is contained in:
Adam Bird 2022-11-02 09:37:44 -04:00 committed by GitHub
parent e1a075268f
commit 57c1f4dce2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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>();
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>();
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>();
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>();
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++;
}