fix: correctly deletes sockets that failed to become clients

This commit is contained in:
Luiz Sardinha
2026-02-25 01:10:43 +01:00
committed by Nick Bolton
parent c0692b6fc7
commit 220bf3178c
4 changed files with 23 additions and 2 deletions

View File

@ -91,6 +91,11 @@ enum class EventTypes : uint32_t
/// This event is sent whenever a server accepts a client.
ClientListenerAccepted,
/** This event is sent whenever a client disconnects/errors out before the connection
is fully accepted.
*/
ClientListenerDisconnectedOnAccept,
/** This event is sent when the client has completed the initial handshake. Until it is sent,
the client is not fully connected.
*/

View File

@ -693,6 +693,7 @@ ISocketMultiplexerJob *SecureSocket::serviceAccept(ISocketMultiplexerJob *const,
#endif
// If status < 0, error happened
if (status < 0) {
sendEvent(EventTypes::ClientListenerDisconnectedOnAccept);
return nullptr;
}

View File

@ -138,6 +138,14 @@ void ClientListener::handleClientConnecting()
[this, rawSocketPointer](const auto &) { handleClientAccepted(rawSocketPointer); }
);
m_events->addHandler(
EventTypes::ClientListenerDisconnectedOnAccept, rawSocketPointer->getEventTarget(),
[this, rawSocketPointer](const auto &) {
LOG_DEBUG("disconnected client before accept");
removeClientSocket(rawSocketPointer);
}
);
// When using non SSL, server accepts clients immediately, while SSL
// has to call secure accept which may require retry
if (m_securityLevel == SecurityLevel::PlainText) {
@ -205,14 +213,20 @@ void ClientListener::handleClientDisconnected(ClientProxy *client)
// we know which socket we no longer need
auto *socket = static_cast<IDataSocket *>(client->getStream());
delete client;
m_clientSockets.erase(socket);
delete socket;
removeClientSocket(socket);
break;
}
}
}
void ClientListener::removeClientSocket(IDataSocket *socket)
{
m_clientSockets.erase(socket);
m_events->removeHandlers(socket->getEventTarget());
delete socket;
}
void ClientListener::cleanupListenSocket()
{
delete m_listen;

View File

@ -71,6 +71,7 @@ private:
void handleUnknownClient(ClientProxyUnknown *unknownClient);
void handleClientDisconnected(ClientProxy *client);
void removeClientSocket(IDataSocket *socket);
void cleanupListenSocket();
void cleanupClientSockets();
void start();