diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 721a309b6..6358cb8f1 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -1372,15 +1372,21 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy) const char *pMap = Unpacker.GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES); int MapCrc = Unpacker.GetInt(); int MapSize = Unpacker.GetInt(); - if(Unpacker.Error() || MapSize < 0) + if(Unpacker.Error()) { return; } + if(MapSize < 0 || MapSize > 1024 * 1024 * 1024) // 1 GiB + { + DisconnectWithReason("invalid map size"); + return; + } for(int i = 0; pMap[i]; i++) // protect the player from nasty map names { if(pMap[i] == '/' || pMap[i] == '\\') { + DisconnectWithReason("strange character in map name"); return; } } @@ -1441,7 +1447,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy) m_pMapdownloadTask = HttpGetFile(pMapUrl ? pMapUrl : aUrl, Storage(), m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE); m_pMapdownloadTask->Timeout(CTimeout{g_Config.m_ClMapDownloadConnectTimeoutMs, 0, g_Config.m_ClMapDownloadLowSpeedLimit, g_Config.m_ClMapDownloadLowSpeedTime}); - m_pMapdownloadTask->MaxResponseSize(1024 * 1024 * 1024); // 1 GiB + m_pMapdownloadTask->MaxResponseSize(MapSize); m_pMapdownloadTask->ExpectSha256(*pMapSha256); Http()->Run(m_pMapdownloadTask); }