fix: correctly deletes sockets that failed to become clients
This commit is contained in:
parent
c0692b6fc7
commit
220bf3178c
4 changed files with 23 additions and 2 deletions
|
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue