From 6c7fd8d6a0414439f7e81b3155b0ff176aaf3979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnter=20Obiltschnig?= Date: Fri, 22 Nov 2024 06:09:33 +0100 Subject: [PATCH] fix(WebTunnel): fix RemotePortForwarder channel close bug (shutting down WebSocket instead of StreamSocket) --- .../include/Poco/WebTunnel/RemotePortForwarder.h | 1 + WebTunnel/src/RemotePortForwarder.cpp | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/WebTunnel/include/Poco/WebTunnel/RemotePortForwarder.h b/WebTunnel/include/Poco/WebTunnel/RemotePortForwarder.h index 0025bf26..82360777 100644 --- a/WebTunnel/include/Poco/WebTunnel/RemotePortForwarder.h +++ b/WebTunnel/include/Poco/WebTunnel/RemotePortForwarder.h @@ -129,6 +129,7 @@ class WebTunnel_API RemotePortForwarder void connectTimeout(SocketDispatcher& dispatcher, Poco::Net::StreamSocket& socket, Poco::UInt16 channel); void forwardData(const char* buffer, int size, Poco::UInt16 channel); void openChannel(Poco::UInt16 channel, Poco::UInt16 port); + void shutdownSendChannel(Poco::UInt16 channel); void removeChannel(Poco::UInt16 channel); void sendResponse(Poco::UInt16 channel, Poco::UInt8 opcode, Poco::UInt16 errorCode); void closeWebSocket(CloseReason reason, bool active); diff --git a/WebTunnel/src/RemotePortForwarder.cpp b/WebTunnel/src/RemotePortForwarder.cpp index eb9d44c9..77fd683f 100644 --- a/WebTunnel/src/RemotePortForwarder.cpp +++ b/WebTunnel/src/RemotePortForwarder.cpp @@ -294,7 +294,7 @@ void RemotePortForwarder::demultiplex(SocketDispatcher& dispatcher, Poco::Net::S } else { - _dispatcher.shutdownSend(socket); + shutdownSendChannel(channel); } break; @@ -490,6 +490,17 @@ void RemotePortForwarder::openChannel(Poco::UInt16 channel, Poco::UInt16 port) } +void RemotePortForwarder::shutdownSendChannel(Poco::UInt16 channel) +{ + Poco::FastMutex::ScopedLock lock(_mutex); + ChannelMap::iterator it = _channelMap.find(channel); + if (it != _channelMap.end()) + { + _dispatcher.shutdownSend(it->second.socket); + } +} + + void RemotePortForwarder::removeChannel(Poco::UInt16 channel) { Poco::FastMutex::ScopedLock lock(_mutex);