summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2009-04-02 15:35:59 +0200
committerBjørn Lindeijer <bjorn@lindeijer.nl>2009-04-02 15:35:59 +0200
commit58d382c73ea18b171ef1d52dee1c456c78754b31 (patch)
tree608ca2a4d8dd427a7c1d95778e9d905fed46510c
parentd20b79683997990a1b46ac8d4117f9195aa278f2 (diff)
downloadmana-58d382c73ea18b171ef1d52dee1c456c78754b31.tar.gz
mana-58d382c73ea18b171ef1d52dee1c456c78754b31.tar.bz2
mana-58d382c73ea18b171ef1d52dee1c456c78754b31.tar.xz
mana-58d382c73ea18b171ef1d52dee1c456c78754b31.zip
Don't use assertions in MessageIn
Not nice if some data corruption would cause the client to crash unnecessarily.
-rw-r--r--src/net/messagein.cpp116
-rw-r--r--src/net/messagein.h2
2 files changed, 57 insertions, 61 deletions
diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp
index f365bb7f..5a2726f6 100644
--- a/src/net/messagein.cpp
+++ b/src/net/messagein.cpp
@@ -28,8 +28,6 @@
#include <SDL_endian.h>
#endif
-#include <cassert>
-
#define MAKEWORD(low,high) \
((unsigned short)(((unsigned char)(low)) | \
((unsigned short)((unsigned char)(high))) << 8))
@@ -109,87 +107,85 @@ void MessageIn::readCoordinates(Uint16 &x, Uint16 &y)
void MessageIn::readCoordinates(Uint16 &x, Uint16 &y, Uint8 &direction)
{
- assert(mPos + 3 <= mLength);
-
- const char *data = mData + mPos;
- Sint16 temp;
-
- temp = MAKEWORD(data[1] & 0x00c0, data[0] & 0x00ff);
- x = temp >> 6;
- temp = MAKEWORD(data[2] & 0x00f0, data[1] & 0x003f);
- y = temp >> 4;
-
- direction = data[2] & 0x000f;
-
- // Translate from eAthena format
- switch (direction)
+ if (mPos + 3 <= mLength)
{
- case 0:
- direction = 1;
- break;
- case 1:
- direction = 3;
- break;
- case 2:
- direction = 2;
- break;
- case 3:
- direction = 6;
- break;
- case 4:
- direction = 4;
- break;
- case 5:
- direction = 12;
- break;
- case 6:
- direction = 8;
- break;
- case 7:
- direction = 9;
- break;
- default:
- // OOPSIE! Impossible or unknown
- direction = 0;
+ const char *data = mData + mPos;
+ Sint16 temp;
+
+ temp = MAKEWORD(data[1] & 0x00c0, data[0] & 0x00ff);
+ x = temp >> 6;
+ temp = MAKEWORD(data[2] & 0x00f0, data[1] & 0x003f);
+ y = temp >> 4;
+
+ direction = data[2] & 0x000f;
+
+ // Translate from eAthena format
+ switch (direction)
+ {
+ case 0:
+ direction = 1;
+ break;
+ case 1:
+ direction = 3;
+ break;
+ case 2:
+ direction = 2;
+ break;
+ case 3:
+ direction = 6;
+ break;
+ case 4:
+ direction = 4;
+ break;
+ case 5:
+ direction = 12;
+ break;
+ case 6:
+ direction = 8;
+ break;
+ case 7:
+ direction = 9;
+ break;
+ default:
+ // OOPSIE! Impossible or unknown
+ direction = 0;
+ }
}
-
mPos += 3;
}
void MessageIn::readCoordinatePair(Uint16 &srcX, Uint16 &srcY,
- Uint16 &dstX, Uint16 &dstY)
+ Uint16 &dstX, Uint16 &dstY)
{
- assert(mPos + 5 <= mLength);
-
- const char *data = mData + mPos;
- Sint16 temp;
-
- temp = MAKEWORD(data[3], data[2] & 0x000f);
- dstX = temp >> 2;
+ if (mPos + 5 <= mLength)
+ {
+ const char *data = mData + mPos;
+ Sint16 temp;
- dstY = MAKEWORD(data[4], data[3] & 0x0003);
+ temp = MAKEWORD(data[3], data[2] & 0x000f);
+ dstX = temp >> 2;
- temp = MAKEWORD(data[1], data[0]);
- srcX = temp >> 6;
+ dstY = MAKEWORD(data[4], data[3] & 0x0003);
- temp = MAKEWORD(data[2], data[1] & 0x003f);
- srcY = temp >> 4;
+ temp = MAKEWORD(data[1], data[0]);
+ srcX = temp >> 6;
+ temp = MAKEWORD(data[2], data[1] & 0x003f);
+ srcY = temp >> 4;
+ }
mPos += 5;
}
void MessageIn::skip(unsigned int length)
{
- assert(mPos + length <= mLength);
mPos += length;
}
std::string MessageIn::readString(int length)
{
// Get string length
- if (length < 0) {
+ if (length < 0)
length = readInt16();
- }
// Make sure the string isn't erroneous
if (length < 0 || mPos + length > mLength) {
diff --git a/src/net/messagein.h b/src/net/messagein.h
index ab206dde..feb5a82f 100644
--- a/src/net/messagein.h
+++ b/src/net/messagein.h
@@ -89,7 +89,7 @@ class MessageIn
std::string readString(int length = -1);
private:
- const char* mData; /**< The message data. */
+ const char *mData; /**< The message data. */
unsigned int mLength; /**< The length of the data. */
unsigned short mId; /**< The message ID. */