From 7dd2024c9e23f0ade5f2870227cec24abfe05748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnter=20Obiltschnig?= Date: Thu, 27 Feb 2025 20:52:02 +0100 Subject: [PATCH] fix(Net): WebSocket receiveFrame() keeps returning the same frame when no payload (flags/header only) #4884 --- Net/src/WebSocketImpl.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Net/src/WebSocketImpl.cpp b/Net/src/WebSocketImpl.cpp index 3f74be543..64873cd28 100644 --- a/Net/src/WebSocketImpl.cpp +++ b/Net/src/WebSocketImpl.cpp @@ -317,9 +317,9 @@ int WebSocketImpl::receiveBytes(void* buffer, int length, int) throw WebSocketException(Poco::format("Insufficient buffer for payload size %d", payloadLength), WebSocket::WS_ERR_PAYLOAD_TOO_BIG); } - skipHeader(_receiveState.headerLength); - _receiveState.payload.resize(payloadLength, false); + + skipHeader(_receiveState.headerLength); } else if (_receiveState.payloadLength > length) { @@ -364,13 +364,16 @@ int WebSocketImpl::receiveBytes(Poco::Buffer& buffer, int, const Poco::Tim payloadLength = peekHeader(_receiveState); } if (payloadLength <= 0) + { + skipHeader(_receiveState.headerLength); return payloadLength; - - skipHeader(_receiveState.headerLength); + } std::size_t oldSize = buffer.size(); buffer.resize(oldSize + payloadLength); + skipHeader(_receiveState.headerLength); + if (receivePayload(buffer.begin() + oldSize, payloadLength, _receiveState.mask, _receiveState.useMask, 0) != payloadLength) throw WebSocketException("Incomplete frame received", WebSocket::WS_ERR_INCOMPLETE_FRAME); @@ -382,11 +385,14 @@ int WebSocketImpl::receiveBytes(Poco::Buffer& buffer, int, const Poco::Tim { int payloadLength = peekHeader(_receiveState); if (payloadLength <= 0) + { + skipHeader(_receiveState.headerLength); return payloadLength; - - skipHeader(_receiveState.headerLength); + } _receiveState.payload.resize(payloadLength, false); + + skipHeader(_receiveState.headerLength); } int payloadOffset = _receiveState.payloadLength - _receiveState.remainingPayloadLength; int n = receivePayload(_receiveState.payload.begin() + payloadOffset, _receiveState.remainingPayloadLength, _receiveState.mask, _receiveState.useMask, _receiveState.maskOffset);