Module: wine Branch: master Commit: f9d40575740fba3e48c5ab2638e630b4a24f3126 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f9d40575740fba3e48c5ab2638...
Author: Alistair Leslie-Hughes leslie_alistair@hotmail.com Date: Wed Sep 7 04:31:42 2016 +0000
ws2_32: Accept shouldn't fail when addrlen32 is NULL.
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com Signed-off-by: Bruno Jesus 00cpxxx@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ws2_32/socket.c | 2 +- dlls/ws2_32/tests/sock.c | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index ccd50f8..f0dc04f 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -2653,7 +2653,7 @@ SOCKET WINAPI WS_accept(SOCKET s, struct WS_sockaddr *addr, int *addrlen32) SERVER_END_REQ; if (!status) { - if (addr && WS_getpeername(as, addr, addrlen32)) + if (addr && addrlen32 && WS_getpeername(as, addr, addrlen32)) { WS_closesocket(as); return SOCKET_ERROR; diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 98ff7c7..be98691 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -4068,7 +4068,7 @@ static void test_accept(void) int ret; SOCKET server_socket, accepted = INVALID_SOCKET, connector; struct sockaddr_in address; - SOCKADDR_STORAGE ss; + SOCKADDR_STORAGE ss, ss_empty; int socklen; select_thread_params thread_params; HANDLE thread_handle = NULL; @@ -4199,6 +4199,19 @@ static void test_accept(void) ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError()); ok(socklen != sizeof(ss), "unexpected length\n"); ok(ss.ss_family, "family not set\n"); + closesocket(accepted); + closesocket(connector); + accepted = connector = INVALID_SOCKET; + + socklen = sizeof(address); + connector = setup_connector_socket(&address, socklen, FALSE); + if (connector == INVALID_SOCKET) goto done; + + memset(&ss, 0, sizeof(ss)); + memset(&ss_empty, 0, sizeof(ss_empty)); + accepted = accept(server_socket, (struct sockaddr *)&ss, NULL); + ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError()); + ok(!memcmp(&ss, &ss_empty, sizeof(ss)), "structure is different\n");
done: if (accepted != INVALID_SOCKET)