From 956978cc7970b27eb513be6f764ca996221885ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Ludwig?= Date: Mon, 30 Jan 2017 10:54:43 +0100 Subject: [PATCH] Fix out of order processing issue with the TCP connection callback. It could happen that the socket FD got reused before the connection callback was cleared. This in turn could result in the new connection callback to get overwritten with null. --- source/eventcore/drivers/posix/sockets.d | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/eventcore/drivers/posix/sockets.d b/source/eventcore/drivers/posix/sockets.d index 16c9ece..c8f0fe2 100644 --- a/source/eventcore/drivers/posix/sockets.d +++ b/source/eventcore/drivers/posix/sockets.d @@ -43,6 +43,8 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets final override StreamSocketFD connectStream(scope Address address, scope Address bind_address, ConnectCallback on_connect) { + assert(on_connect !is null); + auto sockfd = createSocket(address.addressFamily, SOCK_STREAM); if (sockfd == -1) return StreamSocketFD.invalid; @@ -105,8 +107,10 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets m_loop.setNotifyCallback!(EventType.write)(sock, null); with (m_loop.m_fds[sock].streamSocket) { state = ConnectionState.connected; - connectCallback(cast(StreamSocketFD)sock, ConnectStatus.connected); + assert(connectCallback !is null); + auto cb = connectCallback; connectCallback = null; + cb(cast(StreamSocketFD)sock, ConnectStatus.connected); } }