From fe206ee1c8d280ede34b065f63fdb0cfe76cc7ee Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 21 May 2025 18:41:15 +0200 Subject: Core/PacketIO: Allow disabling utf8 validation in SizedString/SizedCString utils --- src/server/game/Server/Packets/PacketUtilities.h | 47 +++++++++++++++--------- 1 file changed, 30 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index 932b3491344..f5c4febcd49 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -60,6 +60,12 @@ namespace WorldPackets namespace Strings { + enum Utf8Mode : uint8 + { + DontValidateUtf8, + ValidUtf8 + }; + struct RawBytes { static bool Validate(std::string_view /*value*/) { return true; } }; template struct ByteSize { static bool Validate(std::string_view value) { return value.size() <= MaxBytesWithoutNullTerminator; } }; @@ -513,32 +519,34 @@ namespace WorldPackets inline BitsSizeReaderWriter BitsSize(Container& value) { return { value }; } template - struct SizedStringWriter + struct DataWriter { Container const& Value; - friend inline ByteBuffer& operator<<(ByteBuffer& data, SizedStringWriter const& string) + friend inline ByteBuffer& operator<<(ByteBuffer& data, DataWriter const& string) { data.WriteString(string.Value); return data; } }; - template - struct SizedStringReaderWriter : SizedStringWriter + template + struct DataReaderWriter : DataWriter { - friend inline ByteBuffer& operator>>(ByteBuffer& data, SizedStringReaderWriter const& string) + static constexpr bool IsUtf8() { return Mode == Strings::ValidUtf8; } + + friend inline ByteBuffer& operator>>(ByteBuffer& data, DataReaderWriter const& string) { - const_cast(string.Value) = data.ReadString(string.Value.length()); + const_cast(string.Value) = data.ReadString(string.Value.length(), IsUtf8()); return data; } }; - template - inline SizedStringWriter Data(Container const& value) { return { value }; } + template + inline DataWriter Data(Container const& value) { return { value }; } - template - inline SizedStringReaderWriter Data(Container& value) { return { value }; } + template + inline DataReaderWriter Data(Container& value) { return { value }; } } // SizedCString (sends size + string + null terminator but only if not empty) @@ -581,31 +589,36 @@ namespace WorldPackets friend inline ByteBuffer& operator<<(ByteBuffer& data, DataWriter const& string) { if (!string.Value.empty()) - data << string.Value; + { + data.WriteString(string.Value); + data << char('\0'); + } return data; } }; - template + template struct DataReaderWriter : DataWriter { + static constexpr bool IsUtf8() { return Mode == Strings::ValidUtf8; } + friend inline ByteBuffer& operator>>(ByteBuffer& data, DataReaderWriter const& string) { if (!string.Value.empty()) { - const_cast(string.Value) = data.ReadString(string.Value.length()); + const_cast(string.Value) = data.ReadString(string.Value.length(), IsUtf8()); (void)data.read(); // null terminator } return data; } }; - template + template inline DataWriter Data(Container const& value) { return { value }; } - template - inline DataReaderWriter Data(Container& value) { return { value }; } - }; + template + inline DataReaderWriter Data(Container& value) { return { value }; } + } } #endif // PacketUtilities_h__ -- cgit v1.2.3