diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index b13df0bb0..ce95a89f7 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -86,6 +86,14 @@ T SwapBE(T in) } } +void TerminateUtf8(char *str, size_t maxLength) +{ + std::string_view inStr { str, maxLength }; + std::string_view truncStr = TruncateUtf8(inStr, maxLength - 1); + size_t utf8Length = truncStr.size(); + str[utf8Length] = '\0'; +} + class LoadHelper { std::unique_ptr m_buffer_; size_t m_cur_ = 0; @@ -269,7 +277,9 @@ void LoadItemData(LoadHelper &file, Item &item) item._iIdentified = file.NextBool32(); item._iMagical = static_cast(file.NextLE()); file.NextBytes(item._iName, ItemNameLength); + TerminateUtf8(item._iName, ItemNameLength); file.NextBytes(item._iIName, ItemNameLength); + TerminateUtf8(item._iIName, ItemNameLength); item._iLoc = static_cast(file.NextLE()); item._iClass = static_cast(file.NextLE()); file.Skip(1); // Alignment @@ -439,6 +449,7 @@ void LoadPlayer(LoadHelper &file, Player &player) player._pLvlChanging = file.NextBool8(); file.NextBytes(player._pName, PlayerNameLength); + TerminateUtf8(player._pName, PlayerNameLength); player._pClass = static_cast(file.NextLE()); file.Skip(3); // Alignment player._pStrength = file.NextLE();