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. /// This event is sent whenever a server accepts a client.
ClientListenerAccepted, 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, /** This event is sent when the client has completed the initial handshake. Until it is sent,
the client is not fully connected. the client is not fully connected.
*/ */

View file

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

View file

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

View file

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