diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-05-21 18:41:15 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-05-26 20:49:51 +0200 |
commit | b1d4d659d592827cd8aa6d93ab85218ce586ea50 (patch) | |
tree | 86565d0d8674e80b7e31c4766f01fd687ba526ee | |
parent | 93195c377a6c4787739e85c8a886c7d5e5e7fbf7 (diff) |
Core/PacketIO: Allow disabling utf8 validation in SizedString/SizedCString utils
(cherry picked from commit fe206ee1c8d280ede34b065f63fdb0cfe76cc7ee)
-rw-r--r-- | src/server/game/Server/Packets/PacketUtilities.h | 47 |
1 files changed, 30 insertions, 17 deletions
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<std::size_t MaxBytesWithoutNullTerminator> struct ByteSize { static bool Validate(std::string_view value) { return value.size() <= MaxBytesWithoutNullTerminator; } }; @@ -513,32 +519,34 @@ namespace WorldPackets inline BitsSizeReaderWriter<BitCount, Container> BitsSize(Container& value) { return { value }; } template<typename Container> - 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<typename Container> - struct SizedStringReaderWriter : SizedStringWriter<Container> + template<typename Container, Strings::Utf8Mode Mode> + struct DataReaderWriter : DataWriter<Container> { - 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<Container&>(string.Value) = data.ReadString(string.Value.length()); + const_cast<Container&>(string.Value) = data.ReadString(string.Value.length(), IsUtf8()); return data; } }; - template<typename Container> - inline SizedStringWriter<Container> Data(Container const& value) { return { value }; } + template<Strings::Utf8Mode = Strings::ValidUtf8, typename Container> + inline DataWriter<Container> Data(Container const& value) { return { value }; } - template<typename Container> - inline SizedStringReaderWriter<Container> Data(Container& value) { return { value }; } + template<Strings::Utf8Mode Mode = Strings::ValidUtf8, typename Container> + inline DataReaderWriter<Container, Mode> 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<typename Container> + template<typename Container, Strings::Utf8Mode Mode> struct DataReaderWriter : DataWriter<Container> { + static constexpr bool IsUtf8() { return Mode == Strings::ValidUtf8; } + friend inline ByteBuffer& operator>>(ByteBuffer& data, DataReaderWriter const& string) { if (!string.Value.empty()) { - const_cast<Container&>(string.Value) = data.ReadString(string.Value.length()); + const_cast<Container&>(string.Value) = data.ReadString(string.Value.length(), IsUtf8()); (void)data.read<char>(); // null terminator } return data; } }; - template<typename Container> + template<Strings::Utf8Mode = Strings::ValidUtf8, typename Container> inline DataWriter<Container> Data(Container const& value) { return { value }; } - template<typename Container> - inline DataReaderWriter<Container> Data(Container& value) { return { value }; } - }; + template<Strings::Utf8Mode Mode = Strings::ValidUtf8, typename Container> + inline DataReaderWriter<Container, Mode> Data(Container& value) { return { value }; } + } } #endif // PacketUtilities_h__ |