From 3b006d81e6a4534dd02c45937e4e2d88b9120d23 Mon Sep 17 00:00:00 2001 From: TLS-Attacker Developer Date: Thu, 26 Jun 2025 15:13:34 +0000 Subject: [PATCH] Fix timeout issue during connection establishment (#193) Added serverSocket.setSoTimeout() before accept() call to prevent indefinite blocking when no client connects. This ensures the server times out appropriately and throws a SocketTimeoutException. - Set serverSocket timeout before calling accept() - Added test to verify timeout behavior works correctly - Fixes issue where server would hang indefinitely waiting for connections --- .../tcp/ServerTcpTransportHandler.java | 1 + .../tcp/ServerTcpTransportHandlerTest.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/Transport/src/main/java/de/rub/nds/tlsattacker/transport/tcp/ServerTcpTransportHandler.java b/Transport/src/main/java/de/rub/nds/tlsattacker/transport/tcp/ServerTcpTransportHandler.java index 8a2e8a22d9..f1f4a86aee 100644 --- a/Transport/src/main/java/de/rub/nds/tlsattacker/transport/tcp/ServerTcpTransportHandler.java +++ b/Transport/src/main/java/de/rub/nds/tlsattacker/transport/tcp/ServerTcpTransportHandler.java @@ -72,6 +72,7 @@ public void initialize() throws IOException { if (serverSocket == null || serverSocket.isClosed()) { throw new IOException("TransportHandler not preinitialized"); } + serverSocket.setSoTimeout((int) timeout); socket = serverSocket.accept(); socket.setSoTimeout((int) timeout); } diff --git a/Transport/src/test/java/de/rub/nds/tlsattacker/transport/tcp/ServerTcpTransportHandlerTest.java b/Transport/src/test/java/de/rub/nds/tlsattacker/transport/tcp/ServerTcpTransportHandlerTest.java index 79d208afac..9903c04c72 100644 --- a/Transport/src/test/java/de/rub/nds/tlsattacker/transport/tcp/ServerTcpTransportHandlerTest.java +++ b/Transport/src/test/java/de/rub/nds/tlsattacker/transport/tcp/ServerTcpTransportHandlerTest.java @@ -13,6 +13,7 @@ import de.rub.nds.tlsattacker.util.FreePortFinder; import java.io.IOException; import java.net.Socket; +import java.net.SocketTimeoutException; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -91,4 +92,26 @@ public void fullTest() throws IOException { assertArrayEquals(new byte[] {4, 3, 2, 1}, received); } } + + /** Test that serverSocket.accept() timeout works correctly */ + @Test + public void testAcceptTimeout() throws IOException { + // Create handler with short timeout + ServerTcpTransportHandler timeoutHandler = + new ServerTcpTransportHandler(500, 500, FreePortFinder.getPossiblyFreePort()); + try { + timeoutHandler.preInitialize(); + // Try to initialize without connecting - should timeout + assertThrows( + SocketTimeoutException.class, + () -> { + timeoutHandler.initialize(); + }); + } finally { + if (timeoutHandler.getServerSocket() != null + && !timeoutHandler.getServerSocket().isClosed()) { + timeoutHandler.getServerSocket().close(); + } + } + } }