aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-05-21 18:41:15 +0200
committerShauren <shauren.trinity@gmail.com>2025-05-21 18:41:15 +0200
commitfe206ee1c8d280ede34b065f63fdb0cfe76cc7ee (patch)
tree3d7ac6f05a0aa5ed93a2e518f578deb82cd9dcf9 /src
parent8c01996cae780a3588e30993c1ebd6f078121ae7 (diff)
Core/PacketIO: Allow disabling utf8 validation in SizedString/SizedCString utils
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h47
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__