summaryrefslogtreecommitdiffhomepage
path: root/serialize
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-01-13 20:11:48 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-01-13 20:11:48 +0100
commitb874b2a50ff1c84c540341797cc9d6fb9ae06d64 (patch)
tree67637e609208e221876a3da2de979c6e17b352a9 /serialize
parent6f85fbd77a0b8798dac3e084ca2250982a7c4011 (diff)
serialize/save: fix write corruption in intern_string()
Diffstat (limited to 'serialize')
-rw-r--r--serialize/world-writer.cpp12
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);