diff --git a/source/vibe/core/net.d b/source/vibe/core/net.d index fbda6b5..778c2e7 100644 --- a/source/vibe/core/net.d +++ b/source/vibe/core/net.d @@ -569,12 +569,18 @@ mixin(tracer); alias waiter = Waitable!(IOCallback, cb => eventDriver.sockets.read(m_socket, m_context.readBuffer.peekDst(), mode, cb), (cb) { cancelled = true; eventDriver.sockets.cancelRead(m_socket); }, - (sock, st, nb) { assert(sock == m_socket); status = st; nbytes = nb; } + (sock, st, nb) { + if (m_socket == StreamSocketFD.invalid) { + cancelled = true; + return; + } + assert(sock == m_socket); status = st; nbytes = nb; + } ); asyncAwaitAny!(true, waiter)(timeout); - if (cancelled) return false; + if (cancelled || !m_context) return false; logTrace("Socket %s, read %s bytes: %s", m_socket, nbytes, status); diff --git a/tests/issue-110-close-while-waitForData.d b/tests/issue-110-close-while-waitForData.d new file mode 100644 index 0000000..e8a7906 --- /dev/null +++ b/tests/issue-110-close-while-waitForData.d @@ -0,0 +1,39 @@ +/+ dub.sdl: + name "test" + dependency "vibe-core" path=".." ++/ +module test; + +import core.time; + +import vibe.core.core; +import vibe.core.net; + +ushort port; +void main() +{ + runTask(&server); + runTask(&client); + + runEventLoop(); +} + +void server() +{ + auto listener = listenTCP(0, (conn) @safe nothrow { + try { sleep(200.msecs); } catch (Exception) {} + }); + port = listener[0].bindAddress.port; +} + +void client() +{ + sleep(100.msecs); + auto tcp = connectTCP("127.0.0.1", port); + runTask({ + sleep(10.msecs); + tcp.close(); + }); + assert(!tcp.waitForData()); + exitEventLoop(true); +} \ No newline at end of file