From 6cba3f5c95b82a4b1efea4e38198ad2823eea693 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Mon, 9 Mar 2026 18:52:34 -0700 Subject: [PATCH] Implement SMSG_MULTIPLE_PACKETS unpacking and fix unused variable warning - Parse bundled sub-packets from SMSG_MULTIPLE_PACKETS using the WotLK standard wire format (uint16_be size + uint16_le opcode + payload), dispatching each through handlePacket() instead of silently discarding. Rate-limited warning for malformed sub-packet overruns. - Remove unused cullRadiusSq variable in TerrainRenderer::renderShadow() that produced a -Wunused-variable warning. --- src/game/game_handler.cpp | 34 +++++++++++++++++++++++++++++- src/rendering/terrain_renderer.cpp | 2 -- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 43a14f09..f1402b57 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -4789,10 +4789,42 @@ void GameHandler::handlePacket(network::Packet& packet) { // ---- Multiple aggregated packets/moves ---- case Opcode::SMSG_MULTIPLE_MOVES: - case Opcode::SMSG_MULTIPLE_PACKETS: packet.setReadPos(packet.getSize()); break; + case Opcode::SMSG_MULTIPLE_PACKETS: { + // Each sub-packet uses the standard WotLK server wire format: + // uint16_be subSize (includes the 2-byte opcode; payload = subSize - 2) + // uint16_le subOpcode + // payload (subSize - 2 bytes) + const auto& pdata = packet.getData(); + size_t dataLen = pdata.size(); + size_t pos = packet.getReadPos(); + static uint32_t multiPktWarnCount = 0; + while (pos + 4 <= dataLen) { + uint16_t subSize = static_cast( + (static_cast(pdata[pos]) << 8) | pdata[pos + 1]); + if (subSize < 2) break; + size_t payloadLen = subSize - 2; + if (pos + 4 + payloadLen > dataLen) { + if (++multiPktWarnCount <= 10) { + LOG_WARNING("SMSG_MULTIPLE_PACKETS: sub-packet overruns buffer at pos=", + pos, " subSize=", subSize, " dataLen=", dataLen); + } + break; + } + uint16_t subOpcode = static_cast(pdata[pos + 2]) | + (static_cast(pdata[pos + 3]) << 8); + std::vector subPayload(pdata.begin() + pos + 4, + pdata.begin() + pos + 4 + payloadLen); + network::Packet subPacket(subOpcode, std::move(subPayload)); + handlePacket(subPacket); + pos += 4 + payloadLen; + } + packet.setReadPos(packet.getSize()); + break; + } + // ---- Misc consume ---- case Opcode::SMSG_SET_PLAYER_DECLINED_NAMES_RESULT: case Opcode::SMSG_PROPOSE_LEVEL_GRANT: diff --git a/src/rendering/terrain_renderer.cpp b/src/rendering/terrain_renderer.cpp index a2d85886..4e8593f5 100644 --- a/src/rendering/terrain_renderer.cpp +++ b/src/rendering/terrain_renderer.cpp @@ -969,8 +969,6 @@ void TerrainRenderer::renderShadow(VkCommandBuffer cmd, const glm::mat4& lightSp vkCmdPushConstants(cmd, shadowPipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT, 0, 128, &push); - const float cullRadiusSq = shadowRadius * shadowRadius; - for (const auto& chunk : chunks) { if (!chunk.isValid()) continue;