aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Packets/ByteBuffer.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-03-15 14:28:29 +0100
committerShauren <shauren.trinity@gmail.com>2021-12-23 15:15:08 +0100
commit09967ad7fdd497439aaa1aea053f4bcb3d37b443 (patch)
treebc560f993a72528ce1347fc7753d8838507745b3 /src/server/shared/Packets/ByteBuffer.cpp
parentbf81c39bbd9e54ff397da9cdce15da92e69037ae (diff)
Core/PacketIO: Validate utf8 in every client packet
(cherry picked from commit 0a2a96efaa20fe5440eb5a2f21ffaddcdcea86d3)
Diffstat (limited to 'src/server/shared/Packets/ByteBuffer.cpp')
-rw-r--r--src/server/shared/Packets/ByteBuffer.cpp41
1 files changed, 39 insertions, 2 deletions
diff --git a/src/server/shared/Packets/ByteBuffer.cpp b/src/server/shared/Packets/ByteBuffer.cpp
index c8aecb24396..c0a4122d745 100644
--- a/src/server/shared/Packets/ByteBuffer.cpp
+++ b/src/server/shared/Packets/ByteBuffer.cpp
@@ -20,6 +20,7 @@
#include "MessageBuffer.h"
#include "Log.h"
#include "Util.h"
+#include <utf8.h>
#include <sstream>
#include <ctime>
@@ -38,11 +39,16 @@ ByteBufferPositionException::ByteBufferPositionException(size_t pos, size_t size
message().assign(ss.str());
}
+ByteBufferInvalidValueException::ByteBufferInvalidValueException(char const* type, size_t pos)
+{
+ message().assign(Trinity::StringFormat("Invalid %s value found in ByteBuffer at pos " SZFMTD));
+}
+
ByteBuffer& ByteBuffer::operator>>(float& value)
{
value = read<float>();
if (!std::isfinite(value))
- throw ByteBufferException();
+ throw ByteBufferInvalidValueException("float", _rpos - sizeof(float));
return *this;
}
@@ -50,10 +56,41 @@ ByteBuffer& ByteBuffer::operator>>(double& value)
{
value = read<double>();
if (!std::isfinite(value))
- throw ByteBufferException();
+ throw ByteBufferInvalidValueException("double", _rpos - sizeof(double));
return *this;
}
+std::string ByteBuffer::ReadCString(bool requireValidUtf8 /*= true*/)
+{
+ std::string value;
+ while (rpos() < size()) // prevent crash at wrong string format in packet
+ {
+ char c = read<char>();
+ if (c == 0)
+ break;
+ value += c;
+ }
+ if (requireValidUtf8 && !utf8::is_valid(value.begin(), value.end()))
+ throw ByteBufferInvalidValueException("string", _rpos - value.length() - 1);
+ return value;
+}
+
+std::string ByteBuffer::ReadString(uint32 length, bool requireValidUtf8 /*= true*/)
+{
+ if (_rpos + length > size())
+ throw ByteBufferPositionException(_rpos, length, size());
+
+ ResetBitPos();
+ if (!length)
+ return std::string();
+
+ std::string value(reinterpret_cast<char const*>(&_storage[_rpos]), length);
+ _rpos += length;
+ if (requireValidUtf8 && !utf8::is_valid(value.begin(), value.end()))
+ throw ByteBufferInvalidValueException("string", _rpos - value.length() - 1);
+ return value;
+}
+
uint32 ByteBuffer::ReadPackedTime()
{
uint32 packedDate = read<uint32>();