[General] Add basic integrity checks to all Actor and World packets

This commit is contained in:
David Cernat 2017-06-02 01:35:32 +03:00
parent e042673779
commit d0a0b6ffa4
32 changed files with 172 additions and 11 deletions

View file

@ -24,7 +24,7 @@ namespace mwmp
protected: protected:
BaseActorList *actorList; BaseActorList *actorList;
static const int maxActors = 3000;
}; };
} }

View file

@ -20,6 +20,12 @@ void PacketActorAI::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -20,6 +20,12 @@ void PacketActorAnimFlags::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -20,6 +20,12 @@ void PacketActorAnimPlay::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -20,6 +20,12 @@ void PacketActorAttack::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -11,11 +11,4 @@ PacketActorAuthority::PacketActorAuthority(RakNet::RakPeerInterface *peer) : Act
void PacketActorAuthority::Packet(RakNet::BitStream *bs, bool send) void PacketActorAuthority::Packet(RakNet::BitStream *bs, bool send)
{ {
ActorPacket::Packet(bs, send); ActorPacket::Packet(bs, send);
if (send)
actorList->count = (unsigned int)(actorList->baseActors.size());
else
actorList->baseActors.clear();
RW(actorList->count, send);
} }

View file

@ -20,6 +20,12 @@ void PacketActorCellChange::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -20,6 +20,12 @@ void PacketActorDeath::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -20,6 +20,12 @@ void PacketActorEquipment::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -21,7 +21,7 @@ void PacketActorList::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > 2000) if (actorList->count > maxActors)
{ {
actorList->isValid = false; actorList->isValid = false;
return; return;

View file

@ -20,6 +20,12 @@ void PacketActorPosition::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -20,6 +20,12 @@ void PacketActorSpeech::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -21,6 +21,12 @@ void PacketActorStatsDynamic::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -20,6 +20,12 @@ void PacketActorTest::Packet(RakNet::BitStream *bs, bool send)
RW(actorList->count, send); RW(actorList->count, send);
if (actorList->count > maxActors)
{
actorList->isValid = false;
return;
}
BaseActor actor; BaseActor actor;
for (unsigned int i = 0; i < actorList->count; i++) for (unsigned int i = 0; i < actorList->count; i++)

View file

@ -22,6 +22,12 @@ void PacketContainer::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);
@ -46,7 +52,7 @@ void PacketContainer::Packet(RakNet::BitStream *bs, bool send)
RW(worldObject.mpNum, send); RW(worldObject.mpNum, send);
RW(worldObject.containerItemCount, send); RW(worldObject.containerItemCount, send);
if (worldObject.containerItemCount > 2000 || worldObject.refId.empty() || (worldObject.refNumIndex != 0 && worldObject.mpNum != 0)) if (worldObject.containerItemCount > maxObjects || worldObject.refId.empty() || (worldObject.refNumIndex != 0 && worldObject.mpNum != 0))
{ {
event->isValid = false; event->isValid = false;
return; return;

View file

@ -19,6 +19,12 @@ void PacketDoorState::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketMusicPlay::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
WorldObject worldObject; WorldObject worldObject;
for (unsigned int i = 0; i < event->worldObjectCount; i++) for (unsigned int i = 0; i < event->worldObjectCount; i++)

View file

@ -19,6 +19,12 @@ void PacketObjectAnimPlay::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketObjectDelete::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketObjectLock::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketObjectMove::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketObjectPlace::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketObjectRotate::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketObjectScale::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketObjectSpawn::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketObjectTrap::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketScriptGlobalShort::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
WorldObject worldObject; WorldObject worldObject;
for (unsigned int i = 0; i < event->worldObjectCount; i++) for (unsigned int i = 0; i < event->worldObjectCount; i++)

View file

@ -19,6 +19,12 @@ void PacketScriptLocalFloat::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketScriptLocalShort::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
RW(event->cell.mData.mFlags, send); RW(event->cell.mData.mFlags, send);
RW(event->cell.mData.mX, send); RW(event->cell.mData.mX, send);
RW(event->cell.mData.mY, send); RW(event->cell.mData.mY, send);

View file

@ -19,6 +19,12 @@ void PacketScriptMemberShort::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
WorldObject worldObject; WorldObject worldObject;
for (unsigned int i = 0; i < event->worldObjectCount; i++) for (unsigned int i = 0; i < event->worldObjectCount; i++)

View file

@ -19,6 +19,12 @@ void PacketVideoPlay::Packet(RakNet::BitStream *bs, bool send)
RW(event->worldObjectCount, send); RW(event->worldObjectCount, send);
if (event->worldObjectCount > maxObjects)
{
event->isValid = false;
return;
}
WorldObject worldObject; WorldObject worldObject;
for (unsigned int i = 0; i < event->worldObjectCount; i++) for (unsigned int i = 0; i < event->worldObjectCount; i++)

View file

@ -23,7 +23,7 @@ namespace mwmp
protected: protected:
BaseEvent *event; BaseEvent *event;
static const int maxObjects = 3000;
}; };
} }