From b874b2a50ff1c84c540341797cc9d6fb9ae06d64 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 13 Jan 2024 20:11:48 +0100 Subject: serialize/save: fix write corruption in intern_string() --- serialize/world-writer.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'serialize/world-writer.cpp') diff --git a/serialize/world-writer.cpp b/serialize/world-writer.cpp index 23381ab8..2e1c7daa 100644 --- a/serialize/world-writer.cpp +++ b/serialize/world-writer.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -303,15 +304,20 @@ void writer_state::serialize_strings() { static_assert(critter_name_max <= string_max); auto len = 0uz; - for (const auto& [k, v] : string_map) + + Array sorted_strings{string_map.size()}; + for (auto [s, i] : string_map) + sorted_strings[i] = s; + + for (const auto& k : sorted_strings) { fm_assert(k.size()+1 < string_max); len += k.size()+1; } string_buf.resize(sizeof(uint32_t) + len); auto s = binary_writer{string_buf.begin()}; - s << (uint32_t)string_map.size(); - for (const auto& [k, v] : string_map) + s << (uint32_t)sorted_strings.size(); + for (const auto& k : sorted_strings) { fm_assert(k.size() < string_max); s.write_asciiz_string(k); -- cgit v1.2.3