diff --git a/apps/openmw-mp/Networking.cpp b/apps/openmw-mp/Networking.cpp index 3eb1dc59d..a28cb8041 100644 --- a/apps/openmw-mp/Networking.cpp +++ b/apps/openmw-mp/Networking.cpp @@ -99,6 +99,13 @@ void Networking::processPlayerPacket(RakNet::Packet *packet) myPacket->setPlayer(player); myPacket->Read(); + if (!myPacket->isPacketValid()) + { + LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Invalid handshake packet from %d", player->getId()); + kickPlayer(player->guid); + return; + } + if (player->isHandshaked()) { LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Wrong handshake with player %d, name: %s", player->getId(), diff --git a/components/openmw-mp/Packets/Player/PacketHandshake.cpp b/components/openmw-mp/Packets/Player/PacketHandshake.cpp index bb6ba0ce7..195e9f71a 100644 --- a/components/openmw-mp/Packets/Player/PacketHandshake.cpp +++ b/components/openmw-mp/Packets/Player/PacketHandshake.cpp @@ -16,6 +16,11 @@ PacketHandshake::PacketHandshake(RakNet::RakPeerInterface *peer) : PlayerPacket( void PacketHandshake::Packet(RakNet::BitStream *bs, bool send) { PlayerPacket::Packet(bs, send); - RW(player->npc.mName, send); - RW(player->passw, send); + + if (!RW(player->npc.mName, send, true, maxNameLen) || + !RW(player->passw, send, true, maxPasswLen)) + { + packetValid = false; + return; + } } diff --git a/components/openmw-mp/Packets/Player/PacketHandshake.hpp b/components/openmw-mp/Packets/Player/PacketHandshake.hpp index e6494c04f..85b537af9 100644 --- a/components/openmw-mp/Packets/Player/PacketHandshake.hpp +++ b/components/openmw-mp/Packets/Player/PacketHandshake.hpp @@ -15,6 +15,9 @@ namespace mwmp PacketHandshake(RakNet::RakPeerInterface *peer); virtual void Packet(RakNet::BitStream *bs, bool send); + + const static uint32_t maxNameLen = 256; + const static uint32_t maxPasswLen = 256; }; }