diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2024-01-13 20:11:48 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2024-01-13 20:11:48 +0100 |
commit | b874b2a50ff1c84c540341797cc9d6fb9ae06d64 (patch) | |
tree | 67637e609208e221876a3da2de979c6e17b352a9 /serialize | |
parent | 6f85fbd77a0b8798dac3e084ca2250982a7c4011 (diff) |
serialize/save: fix write corruption in intern_string()
Diffstat (limited to 'serialize')
-rw-r--r-- | serialize/world-writer.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
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 <algorithm> #include <string_view> #include <tsl/robin_map.h> +#include <Corrade/Containers/Array.h> #include <Corrade/Containers/StringStlHash.h> #include <Corrade/Utility/Path.h> @@ -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<StringView> 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); |