From 3953d932073c5f6a531c04f939fede78f0cadd3b Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Thu, 26 Mar 2026 02:53:21 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20error=20parsing:=201?= =?UTF-8?q?=20frame=20=3D=201=20packet=20=D0=B8=20safe=20handshake=20fallb?= =?UTF-8?q?ack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../messenger/network/PacketHandshake.kt | 3 +- .../com/rosetta/messenger/network/Protocol.kt | 74 ++++++++----------- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/network/PacketHandshake.kt b/app/src/main/java/com/rosetta/messenger/network/PacketHandshake.kt index feeaabf..acc663f 100644 --- a/app/src/main/java/com/rosetta/messenger/network/PacketHandshake.kt +++ b/app/src/main/java/com/rosetta/messenger/network/PacketHandshake.kt @@ -6,7 +6,8 @@ enum class HandshakeState(val value: Int) { companion object { fun fromValue(value: Int): HandshakeState { - return entries.firstOrNull { it.value == value } ?: COMPLETED + // Fail-safe: unknown value must not auto-authenticate. + return entries.firstOrNull { it.value == value } ?: NEED_DEVICE_VERIFICATION } } } diff --git a/app/src/main/java/com/rosetta/messenger/network/Protocol.kt b/app/src/main/java/com/rosetta/messenger/network/Protocol.kt index 8f8c7ef..9605f41 100644 --- a/app/src/main/java/com/rosetta/messenger/network/Protocol.kt +++ b/app/src/main/java/com/rosetta/messenger/network/Protocol.kt @@ -535,52 +535,40 @@ class Protocol( log("📥 Received ${data.size} bytes: $hexDump${if (data.size > 50) "..." else ""}") val stream = Stream(data) - var parsedPackets = 0 + if (stream.getRemainingBits() < MIN_PACKET_ID_BITS) { + log("⚠️ Frame too short to contain packet ID (${stream.getRemainingBits()} bits)") + return + } + // Desktop/server parity: one WebSocket frame contains one packet. + val packetId = stream.readInt16() + log("📥 Packet ID: $packetId") - while (stream.getRemainingBits() >= MIN_PACKET_ID_BITS) { - val packetStartBits = stream.getReadPointerBits() - val packetId = stream.readInt16() - - log("📥 Packet ID: $packetId") - - val packetFactory = supportedPackets[packetId] - if (packetFactory == null) { - log("⚠️ Unknown packet ID: $packetId, stopping frame parse") - break - } - - val packet = packetFactory() - try { - packet.receive(stream) - } catch (e: Exception) { - log("❌ Error parsing packet $packetId: ${e.message}") - e.printStackTrace() - break - } - - // Notify waiters - val waitersCount = packetWaiters[packetId]?.size ?: 0 - log("📥 Notifying $waitersCount waiter(s) for packet $packetId") - - packetWaiters[packetId]?.forEach { callback -> - try { - callback(packet) - } catch (e: Exception) { - log("❌ Error in packet handler: ${e.message}") - e.printStackTrace() - } - } - - parsedPackets++ - val consumedBits = stream.getReadPointerBits() - packetStartBits - if (consumedBits <= 0) { - log("⚠️ Packet parser made no progress for packet $packetId, stopping frame parse") - break - } + val packetFactory = supportedPackets[packetId] + if (packetFactory == null) { + log("⚠️ Unknown packet ID: $packetId") + return } - if (parsedPackets > 1) { - log("📦 Parsed $parsedPackets packets from single WebSocket frame") + val packet = packetFactory() + try { + packet.receive(stream) + } catch (e: Exception) { + log("❌ Error parsing packet $packetId: ${e.message}") + e.printStackTrace() + return + } + + // Notify waiters + val waitersCount = packetWaiters[packetId]?.size ?: 0 + log("📥 Notifying $waitersCount waiter(s) for packet $packetId") + + packetWaiters[packetId]?.forEach { callback -> + try { + callback(packet) + } catch (e: Exception) { + log("❌ Error in packet handler: ${e.message}") + e.printStackTrace() + } } } catch (e: Exception) { log("❌ Error parsing packet: ${e.message}")