From 24b243bbf5af51c8fb5f1d45fc83f0ec56e4d493 Mon Sep 17 00:00:00 2001 From: Quinton Miller Date: Thu, 5 Sep 2024 00:23:48 +0800 Subject: [PATCH] Use correct timeout for `Socket#connect` on Windows (#14961) It does not appear the use of `read_timeout` here was intended. This applies to connection-oriented sockets only. Connectionless sockets like `UDPSocket` call `Crystal::System::Socket#system_connect_connectionless` instead which ignores the timeout parameter. --- src/crystal/system/win32/event_loop_iocp.cr | 2 +- src/crystal/system/win32/socket.cr | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/crystal/system/win32/event_loop_iocp.cr b/src/crystal/system/win32/event_loop_iocp.cr index 6f9a921ad8d3..d1aae09b680a 100644 --- a/src/crystal/system/win32/event_loop_iocp.cr +++ b/src/crystal/system/win32/event_loop_iocp.cr @@ -228,7 +228,7 @@ class Crystal::IOCP::EventLoop < Crystal::EventLoop end def connect(socket : ::Socket, address : ::Socket::Addrinfo | ::Socket::Address, timeout : ::Time::Span?) : IO::Error? - socket.overlapped_connect(socket.fd, "ConnectEx") do |overlapped| + socket.overlapped_connect(socket.fd, "ConnectEx", timeout) do |overlapped| # This is: LibC.ConnectEx(fd, address, address.size, nil, 0, nil, overlapped) Crystal::System::Socket.connect_ex.call(socket.fd, address.to_unsafe, address.size, Pointer(Void).null, 0_u32, Pointer(UInt32).null, overlapped.to_unsafe) end diff --git a/src/crystal/system/win32/socket.cr b/src/crystal/system/win32/socket.cr index 78645d51f320..3172be467836 100644 --- a/src/crystal/system/win32/socket.cr +++ b/src/crystal/system/win32/socket.cr @@ -128,7 +128,7 @@ module Crystal::System::Socket end # :nodoc: - def overlapped_connect(socket, method, &) + def overlapped_connect(socket, method, timeout, &) IOCP::OverlappedOperation.run(socket) do |operation| result = yield operation @@ -145,7 +145,7 @@ module Crystal::System::Socket return nil end - operation.wait_for_wsa_result(read_timeout) do |error| + operation.wait_for_wsa_result(timeout) do |error| case error when .wsa_io_incomplete?, .wsaeconnrefused? return ::Socket::ConnectError.from_os_error(method, error)