From cddc1b78db1ca8d1cce0580b5f7c983dd702339f Mon Sep 17 00:00:00 2001 From: thomas Date: Fri, 31 Jan 2025 01:51:35 +0100 Subject: [PATCH] KTOR-8135 Socket accept not throwing error on socket close on native --- .../ktor/network/sockets/tests/TCPSocketTest.kt | 16 ++++++++++++++++ .../io/ktor/network/selector/SelectUtilsNix.kt | 1 + .../ktor/network/selector/SelectUtilsWindows.kt | 2 ++ 3 files changed, 19 insertions(+) diff --git a/ktor-network/common/test/io/ktor/network/sockets/tests/TCPSocketTest.kt b/ktor-network/common/test/io/ktor/network/sockets/tests/TCPSocketTest.kt index 3687478c547..57ee98f353b 100644 --- a/ktor-network/common/test/io/ktor/network/sockets/tests/TCPSocketTest.kt +++ b/ktor-network/common/test/io/ktor/network/sockets/tests/TCPSocketTest.kt @@ -165,4 +165,20 @@ class TCPSocketTest { serverConnection.close() server.close() } + + @Test + fun testAcceptErrorOnSocketClose() = testSockets { selector -> + val socket = aSocket(selector) + .tcp() + .bind(InetSocketAddress("127.0.0.1", 0)) + + launch { + assertFailsWith { + socket.accept() + } + } + delay(100) // Make sure socket is awaiting connection using ACCEPT + + socket.close() + } } diff --git a/ktor-network/nix/src/io/ktor/network/selector/SelectUtilsNix.kt b/ktor-network/nix/src/io/ktor/network/selector/SelectUtilsNix.kt index 6c4bafa3293..582a156572c 100644 --- a/ktor-network/nix/src/io/ktor/network/selector/SelectUtilsNix.kt +++ b/ktor-network/nix/src/io/ktor/network/selector/SelectUtilsNix.kt @@ -200,6 +200,7 @@ internal actual class SelectorHelper { for (event in watchSet) { if (event.descriptor in closeSet) { completed.add(event) + event.fail(IOException("Selectable closed")) continue } diff --git a/ktor-network/windows/src/io/ktor/network/selector/SelectUtilsWindows.kt b/ktor-network/windows/src/io/ktor/network/selector/SelectUtilsWindows.kt index f5e83be903b..326fc83f0cc 100644 --- a/ktor-network/windows/src/io/ktor/network/selector/SelectUtilsWindows.kt +++ b/ktor-network/windows/src/io/ktor/network/selector/SelectUtilsWindows.kt @@ -10,6 +10,7 @@ import io.ktor.utils.io.* import io.ktor.utils.io.errors.* import kotlinx.cinterop.* import kotlinx.coroutines.* +import kotlinx.io.IOException import platform.posix.* import kotlin.coroutines.cancellation.CancellationException @@ -152,6 +153,7 @@ internal actual class SelectorHelper { watchSet.forEach { event -> if (event.descriptor in closeSet) { completed.add(event) + event.fail(IOException("Selectable closed")) return@forEach } val wsaEvent = wsaEvents.getValue(event.descriptor)