diff --git a/docs/net_protocol.txt b/docs/net_protocol.txt index 3f76952a..32fe7c06 100644 --- a/docs/net_protocol.txt +++ b/docs/net_protocol.txt @@ -26,7 +26,7 @@ PokerTH general message format: | +-------------------------------+ / | padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -Minimum length is 8. Maximum length is 264. +Minimum length is 8. Maximum length is 268. Client Request: Init @@ -135,9 +135,12 @@ Server/Client Reply: Avatar File +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Request ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Avatar Block Size | Reserved | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | \ Avatar File Data (up to 256 Bytes) / - | + + | +-------------------------------+ + / | padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ [Additional blocks will be sent if data is more than 256 Bytes.] diff --git a/src/net/common/netpacket.cpp b/src/net/common/netpacket.cpp index e79351f0..975b3896 100644 --- a/src/net/common/netpacket.cpp +++ b/src/net/common/netpacket.cpp @@ -165,6 +165,8 @@ struct GCC_PACKED NetPacketAvatarFileData { NetPacketHeader head; u_int32_t requestId; + u_int16_t blockSize; + u_int16_t reserved; }; struct GCC_PACKED NetPacketAvatarEndData @@ -1483,11 +1485,12 @@ NetPacketAvatarFile::SetData(const NetPacketAvatarFile::Data &inData) Resize((u_int16_t) (sizeof(NetPacketAvatarFileData) - + fileDataSize)); + + ADD_PADDING(fileDataSize))); NetPacketAvatarFileData *tmpData = (NetPacketAvatarFileData *)GetRawData(); tmpData->requestId = htonl(inData.requestId); + tmpData->blockSize = htons(fileDataSize); char *avatarDataPtr = (char *)tmpData + sizeof(NetPacketAvatarFileData); memcpy(avatarDataPtr, &inData.fileData[0], fileDataSize); @@ -1502,8 +1505,8 @@ NetPacketAvatarFile::GetData(NetPacketAvatarFile::Data &outData) const NetPacketAvatarFileData *tmpData = (NetPacketAvatarFileData *)GetRawData(); outData.requestId = ntohl(tmpData->requestId); + int fileDataSize = ntohs(tmpData->blockSize); - int fileDataSize = GetLen() - sizeof(NetPacketAvatarFileData); char *avatarDataPtr = (char *)tmpData + sizeof(NetPacketAvatarFileData); outData.fileData.resize(fileDataSize); memcpy(&outData.fileData[0], avatarDataPtr, fileDataSize); @@ -1516,9 +1519,23 @@ NetPacketAvatarFile::ToNetPacketAvatarFile() const } void -NetPacketAvatarFile::InternalCheck(const NetPacketHeader*) const +NetPacketAvatarFile::InternalCheck(const NetPacketHeader *data) const { - // Nothing to do. + u_int16_t dataLen = ntohs(data->length); + NetPacketAvatarFileData *tmpData = (NetPacketAvatarFileData *)data; + int fileDataSize = ntohs(tmpData->blockSize); + + // Exact checking of dynamic packet size. + if (dataLen != + sizeof(NetPacketAvatarFileData) + + ADD_PADDING(fileDataSize)) + { + throw NetException(ERR_SOCK_INVALID_PACKET, 0); + } + if (!fileDataSize || fileDataSize > MAX_FILE_DATA_SIZE) + { + throw NetException(ERR_SOCK_INVALID_PACKET, 0); + } } //----------------------------------------------------------------------------- diff --git a/src/net/netpacket.h b/src/net/netpacket.h index b0538b80..44a9c582 100644 --- a/src/net/netpacket.h +++ b/src/net/netpacket.h @@ -34,7 +34,7 @@ #define NET_VERSION_MINOR 0 #define MIN_PACKET_SIZE 4 -#define MAX_PACKET_SIZE 264 +#define MAX_PACKET_SIZE 268 #define MAX_NAME_SIZE 64 #define MAX_PASSWORD_SIZE 64 #define MAX_NUM_MANUAL_BLINDS 30