aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMachiavelli <machiavelli.trinity@gmail.com>2012-02-28 14:51:50 +0100
committerMachiavelli <machiavelli.trinity@gmail.com>2012-02-28 14:51:50 +0100
commit218ed813d0a2d26fd594ddafa2132cc7c5209bb4 (patch)
tree8a12345664a828c628993da00cb4f0933cbc3ba2
parent3ea9fe4022f5614553b1e9ec9be4e731d7809419 (diff)
Core/Misc: Add more extensive ByteBuffer exceptions to trace down seemingly random crashes.
-rwxr-xr-xsrc/server/shared/Packets/ByteBuffer.h68
1 files changed, 51 insertions, 17 deletions
diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h
index 6b99b79625d..abd0ed357e4 100755
--- a/src/server/shared/Packets/ByteBuffer.h
+++ b/src/server/shared/Packets/ByteBuffer.h
@@ -27,22 +27,49 @@
class ByteBufferException
{
public:
- ByteBufferException(bool _add, size_t _pos, size_t _esize, size_t _size)
- : add(_add), pos(_pos), esize(_esize), size(_size)
+ ByteBufferException(size_t pos, size_t size, size_t valueSize)
+ : Pos(pos), Size(size), ValueSize(valueSize)
{
- PrintPosError();
+ PrintError();
}
- void PrintPosError() const
+ protected:
+ virtual void PrintError() const = 0;
+
+ size_t Pos;
+ size_t Size;
+ size_t ValueSize;
+};
+
+class ByteBufferPositionException : public ByteBufferException
+{
+ public:
+ ByteBufferPositionException(bool add, size_t pos, size_t size, size_t valueSize)
+ : ByteBufferException(pos, size, valueSize), _add(add) {}
+
+ protected:
+ void PrintError() const override
{
- sLog->outError("Attempted to %s in ByteBuffer (pos: " SIZEFMTD " size: "SIZEFMTD") value with size: " SIZEFMTD,
- (add ? "put" : "get"), pos, size, esize);
+ sLog->outError("Attempted to %s value with size: "SIZEFMTD" in ByteBuffer (pos: " SIZEFMTD " size: "SIZEFMTD") " ,
+ ValueSize, (_add ? "put" : "get"), Pos, Size);
}
+
private:
- bool add;
- size_t pos;
- size_t esize;
- size_t size;
+ bool _add;
+};
+
+class ByteBufferSourceException : public ByteBufferException
+{
+ public:
+ ByteBufferSourceException(size_t pos, size_t size, size_t valueSize)
+ : ByteBufferException(pos, size, valueSize) {}
+
+ protected:
+ void PrintError() const override
+ {
+ sLog->outError("Attempted to put a %s in ByteBuffer (pos: "SIZEFMTD" size: "SIZEFMTD")",
+ (ValueSize > 0 ? "NULL-pointer" : "zero-sized value"), Pos, Size);
+ }
};
class ByteBuffer
@@ -271,7 +298,7 @@ class ByteBuffer
void read_skip(size_t skip)
{
if (_rpos + skip > size())
- throw ByteBufferException(false, _rpos, skip, size());
+ throw ByteBufferPositionException(false, _rpos, skip, size());
_rpos += skip;
}
@@ -285,7 +312,7 @@ class ByteBuffer
template <typename T> T read(size_t pos) const
{
if (pos + sizeof(T) > size())
- throw ByteBufferException(false, pos, sizeof(T), size());
+ throw ByteBufferPositionException(false, pos, sizeof(T), size());
T val = *((T const*)&_storage[pos]);
EndianConvert(val);
return val;
@@ -294,7 +321,7 @@ class ByteBuffer
void read(uint8 *dest, size_t len)
{
if (_rpos + len > size())
- throw ByteBufferException(false, _rpos, len, size());
+ throw ByteBufferPositionException(false, _rpos, len, size());
memcpy(dest, &_storage[_rpos], len);
_rpos += len;
}
@@ -302,7 +329,7 @@ class ByteBuffer
void readPackGUID(uint64& guid)
{
if (rpos() + 1 > size())
- throw ByteBufferException(false, _rpos, 1, size());
+ throw ByteBufferPositionException(false, _rpos, 1, size());
guid = 0;
@@ -314,7 +341,7 @@ class ByteBuffer
if (guidmark & (uint8(1) << i))
{
if (rpos() + 1 > size())
- throw ByteBufferException(false, _rpos, 1, size());
+ throw ByteBufferPositionException(false, _rpos, 1, size());
uint8 bit;
(*this) >> bit;
@@ -359,7 +386,10 @@ class ByteBuffer
void append(const uint8 *src, size_t cnt)
{
if (!cnt)
- return;
+ throw ByteBufferSourceException(_wpos, size(), cnt);
+
+ if (!src)
+ throw ByteBufferSourceException(_wpos, size(), cnt);
ASSERT(size() < 10000000);
@@ -407,7 +437,11 @@ class ByteBuffer
void put(size_t pos, const uint8 *src, size_t cnt)
{
if (pos + cnt > size())
- throw ByteBufferException(true, pos, cnt, size());
+ throw ByteBufferPositionException(true, pos, cnt, size());
+
+ if (!src)
+ throw ByteBufferSourceException(_wpos, size(), cnt);
+
memcpy(&_storage[pos], src, cnt);
}