diff --git a/dll/win32/msafd/misc/dllmain.c b/dll/win32/msafd/misc/dllmain.c index e1faf4d6450..d09a9e16c20 100644 --- a/dll/win32/msafd/misc/dllmain.c +++ b/dll/win32/msafd/misc/dllmain.c @@ -2103,7 +2103,11 @@ WSPConnect(SOCKET Handle, Status = IOSB->Status; } - Socket->SharedData->SocketLastError = TranslateNtStatusError(Status); + if (Status == STATUS_LOCAL_DISCONNECT) + Socket->SharedData->SocketLastError = WSAETIMEDOUT; + else + Socket->SharedData->SocketLastError = TranslateNtStatusError(Status); + if (Status != STATUS_SUCCESS) goto Leave; @@ -2174,6 +2178,10 @@ Leave: } } + if (Status == STATUS_LOCAL_DISCONNECT && Errno == 0) + { + Status = STATUS_TIMEOUT; + } return MsafdReturnWithErrno(Status, lpErrno, 0, NULL); } diff --git a/modules/rostests/apitests/ws2_32/CMakeLists.txt b/modules/rostests/apitests/ws2_32/CMakeLists.txt index 088d7c632db..4af3422d72d 100644 --- a/modules/rostests/apitests/ws2_32/CMakeLists.txt +++ b/modules/rostests/apitests/ws2_32/CMakeLists.txt @@ -15,6 +15,7 @@ list(APPEND SOURCE recv.c send.c WSAAsync.c + WSAEtimedout.c WSAIoctl.c WSARecv.c WSAStartup.c) diff --git a/modules/rostests/apitests/ws2_32/WSAEtimedout.c b/modules/rostests/apitests/ws2_32/WSAEtimedout.c new file mode 100644 index 00000000000..4ccf1663622 --- /dev/null +++ b/modules/rostests/apitests/ws2_32/WSAEtimedout.c @@ -0,0 +1,33 @@ +/* + * PROJECT: ReactOS API Tests + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Unit Tests for ws2_32 WSAETIMEDOUT (CORE-12096) + * COPYRIGHTS: Copyright 2026 Doug Lyons + */ + +#include "ws2_32.h" + +START_TEST(WSAEtimedout) +{ + WSADATA wsaData; + int nConRes; + + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) + { + skip("WSAStartup failed\n"); + return; + } + + SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + struct sockaddr_in clientService; + clientService.sin_family = AF_INET; + clientService.sin_addr.s_addr = inet_addr("192.0.2.1"); + clientService.sin_port = htons(123); + + nConRes = connect(ConnectSocket, (SOCKADDR *)&clientService, sizeof(clientService)); + ok(nConRes == SOCKET_ERROR, "ERROR: socket connect() result is not SOCKET_ERROR\n"); + ok(WSAGetLastError() == WSAETIMEDOUT, "ERROR: socket connect() last error is not WSAETIMEDOUT\n"); + + closesocket(ConnectSocket); + WSACleanup(); +} diff --git a/modules/rostests/apitests/ws2_32/testlist.c b/modules/rostests/apitests/ws2_32/testlist.c index 413686e3098..fb1d622e469 100644 --- a/modules/rostests/apitests/ws2_32/testlist.c +++ b/modules/rostests/apitests/ws2_32/testlist.c @@ -16,6 +16,7 @@ extern void func_open_osfhandle(void); extern void func_recv(void); extern void func_send(void); extern void func_WSAAsync(void); +extern void func_WSAEtimedout(void); extern void func_WSAIoctl(void); extern void func_WSARecv(void); extern void func_WSAStartup(void); @@ -36,6 +37,7 @@ const struct test winetest_testlist[] = { "recv", func_recv }, { "send", func_send }, { "WSAAsync", func_WSAAsync }, + { "WSAETimedout", func_WSAEtimedout }, { "WSAIoctl", func_WSAIoctl }, { "WSARecv", func_WSARecv }, { "WSAStartup", func_WSAStartup },