[8378] Use exceptions instead of explicit size checking for each packet

CHECK_PACKET_SIZE was pretty error prone; once it was forgotten mangosd
could crash due to the asserts in ByteBuffer.h. That was exploitable by
malicious players.
Furthermore, there were duplicate checks: Additionally to
CHECK_PACKET_SIZE, the ByteBuffer assertions keept an eye
on not exceeding the packet boundaries - just to crash the server for
sure in such a case.
To prevent memory leaks or other undesirable states, please read in
every handler all variables _before_ doing any concrete handling.
This commit is contained in:
arrai 2009-08-15 22:06:35 +02:00
parent c26c7395a1
commit a24f39a36f
32 changed files with 129 additions and 741 deletions

View file

@ -47,8 +47,6 @@
void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 8+8+4+1+5*8+2+1+4+4);
sLog.outDebug("Received opcode CMSG_PETITION_BUY");
//recv_data.hexlike();
@ -65,9 +63,6 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data)
recv_data >> unk2; // 0
recv_data >> name; // name
// recheck
CHECK_PACKET_SIZE(recv_data, 8+8+4+(name.size()+1)+5*8+2+1+4+4);
recv_data >> unk3; // 0
recv_data >> unk4; // 0
recv_data >> unk5; // 0
@ -236,8 +231,6 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data)
void WorldSession::HandlePetitionShowSignOpcode(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 8);
// ok
sLog.outDebug("Received opcode CMSG_PETITION_SHOW_SIGNATURES");
//recv_data.hexlike();
@ -293,8 +286,6 @@ void WorldSession::HandlePetitionShowSignOpcode(WorldPacket & recv_data)
void WorldSession::HandlePetitionQueryOpcode(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 4+8);
sLog.outDebug("Received opcode CMSG_PETITION_QUERY"); // ok
//recv_data.hexlike();
@ -370,8 +361,6 @@ void WorldSession::SendPetitionQueryOpcode(uint64 petitionguid)
void WorldSession::HandlePetitionRenameOpcode(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 8+1);
sLog.outDebug("Received opcode MSG_PETITION_RENAME"); // ok
//recv_data.hexlike();
@ -441,8 +430,6 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket & recv_data)
void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 8+1);
sLog.outDebug("Received opcode CMSG_PETITION_SIGN"); // ok
//recv_data.hexlike();
@ -571,8 +558,6 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data)
void WorldSession::HandlePetitionDeclineOpcode(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 8);
sLog.outDebug("Received opcode MSG_PETITION_DECLINE"); // ok
//recv_data.hexlike();
@ -600,8 +585,6 @@ void WorldSession::HandlePetitionDeclineOpcode(WorldPacket & recv_data)
void WorldSession::HandleOfferPetitionOpcode(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 4+8+8);
sLog.outDebug("Received opcode CMSG_OFFER_PETITION"); // ok
//recv_data.hexlike();
@ -705,8 +688,6 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket & recv_data)
void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 8);
sLog.outDebug("Received opcode CMSG_TURN_IN_PETITION"); // ok
//recv_data.hexlike();
@ -853,7 +834,6 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data)
return;
}
CHECK_PACKET_SIZE(recv_data, 8+5*4);
uint32 icon, iconcolor, border, bordercolor, backgroud;
recv_data >> backgroud >> icon >> iconcolor >> border >> bordercolor;
@ -891,8 +871,6 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data)
void WorldSession::HandlePetitionShowListOpcode(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 8);
sLog.outDebug("Received CMSG_PETITION_SHOWLIST"); // ok
//recv_data.hexlike();