forked from mirror/openmw-tes3mp
[General] Add basic integrity check to reading of Container packets
This commit is contained in:
parent
46501909ff
commit
05564bd123
4 changed files with 23 additions and 4 deletions
|
@ -40,11 +40,16 @@ bool WorldProcessor::Process(RakNet::Packet &packet, BaseEvent &event) noexcept
|
||||||
WorldPacket *myPacket = Networking::get().getWorldPacketController()->GetPacket(packet.data[0]);
|
WorldPacket *myPacket = Networking::get().getWorldPacketController()->GetPacket(packet.data[0]);
|
||||||
|
|
||||||
myPacket->setEvent(&event);
|
myPacket->setEvent(&event);
|
||||||
|
event.isValid = true;
|
||||||
|
|
||||||
if (!processor.second->avoidReading)
|
if (!processor.second->avoidReading)
|
||||||
myPacket->Read();
|
myPacket->Read();
|
||||||
|
|
||||||
|
if (event.isValid)
|
||||||
processor.second->Do(*myPacket, *player, event);
|
processor.second->Do(*myPacket, *player, event);
|
||||||
|
else
|
||||||
|
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,12 +28,17 @@ bool WorldProcessor::Process(RakNet::Packet &packet, WorldEvent &event)
|
||||||
myGuid = Main::get().getLocalPlayer()->guid;
|
myGuid = Main::get().getLocalPlayer()->guid;
|
||||||
request = packet.length == myPacket->headerSize();
|
request = packet.length == myPacket->headerSize();
|
||||||
|
|
||||||
|
event.isValid = true;
|
||||||
|
|
||||||
if (!request && !processor.second->avoidReading)
|
if (!request && !processor.second->avoidReading)
|
||||||
{
|
{
|
||||||
myPacket->Read();
|
myPacket->Read();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (event.isValid)
|
||||||
processor.second->Do(*myPacket, event);
|
processor.second->Do(*myPacket, event);
|
||||||
|
else
|
||||||
|
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,6 +83,8 @@ namespace mwmp
|
||||||
ESM::Cell cell;
|
ESM::Cell cell;
|
||||||
|
|
||||||
unsigned char action; // 0 - Clear and set in entirety, 1 - Add item, 2 - Remove item, 3 - Request items
|
unsigned char action; // 0 - Clear and set in entirety, 1 - Add item, 2 - Remove item, 3 - Request items
|
||||||
|
|
||||||
|
bool isValid;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <components/openmw-mp/NetworkMessages.hpp>
|
#include <components/openmw-mp/NetworkMessages.hpp>
|
||||||
|
#include <components/openmw-mp/Log.hpp>
|
||||||
#include "PacketContainer.hpp"
|
#include "PacketContainer.hpp"
|
||||||
|
|
||||||
using namespace mwmp;
|
using namespace mwmp;
|
||||||
|
@ -49,13 +50,19 @@ 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))
|
||||||
|
{
|
||||||
|
event->isValid = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ContainerItem containerItem;
|
ContainerItem containerItem;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < worldObject.containerItemCount; i++)
|
for (unsigned int j = 0; j < worldObject.containerItemCount; j++)
|
||||||
{
|
{
|
||||||
if (send)
|
if (send)
|
||||||
{
|
{
|
||||||
containerItem = worldObject.containerItems.at(i);
|
containerItem = worldObject.containerItems.at(j);
|
||||||
}
|
}
|
||||||
|
|
||||||
RW(containerItem.refId, send);
|
RW(containerItem.refId, send);
|
||||||
|
|
Loading…
Reference in a new issue