From 69911978ea054143e732845104f087ed8aea5f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo?= Date: Fri, 11 Sep 2026 16:21:56 -0300 Subject: [PATCH 1/2] Fix connection release ordering This change moves the ConnectionManager release call out of the critical section in Connection::close(). The connection lock is now cleared before releasing the connection back to the manager, avoiding lock-ordering and re-entrancy issues while the socket is being torn down. --- src/server/network/connection/connection.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/server/network/connection/connection.cpp b/src/server/network/connection/connection.cpp index 1d7cb48cf..4ee11c6fa 100644 --- a/src/server/network/connection/connection.cpp +++ b/src/server/network/connection/connection.cpp @@ -67,9 +67,7 @@ Connection::Connection(asio::io_service &initIoService, ConstServicePort_ptr ini } void Connection::close(bool force) { - ConnectionManager::getInstance().releaseConnection(shared_from_this()); - - std::scoped_lock lock(connectionLock); + std::unique_lock lock(connectionLock); ip = 0; if (connectionState == CONNECTION_STATE_CLOSED) { @@ -84,6 +82,9 @@ void Connection::close(bool force) { if (messageQueue.empty() || force) { closeSocket(); } + + lock.unlock(); + ConnectionManager::getInstance().releaseConnection(shared_from_this()); } void Connection::closeSocket() { From 7256e6144dd063f5e29400f0563a66a3b9dca646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo?= Date: Mon, 14 Sep 2026 11:03:11 -0300 Subject: [PATCH 2/2] Fix protocol send callback race Capture the active protocol before calling onSendMessage while the worker lock is released. This prevents dereferencing a stale or replaced protocol pointer during message sending and avoids potential use-after-free issues. --- src/server/network/connection/connection.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/network/connection/connection.cpp b/src/server/network/connection/connection.cpp index 4ee11c6fa..26c03e8bf 100644 --- a/src/server/network/connection/connection.cpp +++ b/src/server/network/connection/connection.cpp @@ -372,8 +372,9 @@ void Connection::internalWorker() { } const auto &outputMessage = messageQueue.front(); + auto currentProtocol = protocol; lock.unlock(); - protocol->onSendMessage(outputMessage); + currentProtocol->onSendMessage(outputMessage); lock.lock(); internalSend(outputMessage);