Bruno Jesus : ws2_32: Cope with NULL address in connect() call.
Module: wine Branch: master Commit: dcf258685e9deb72c2b7d4bae9d0c667b727d090 URL: http://source.winehq.org/git/wine.git/?a=commit;h=dcf258685e9deb72c2b7d4bae9... Author: Bruno Jesus <bjesus(a)codeweavers.com> Date: Sun Feb 26 22:25:43 2017 -0300 ws2_32: Cope with NULL address in connect() call. Signed-off-by: Bruno Jesus <bjesus(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ws2_32/socket.c | 7 +++++-- dlls/ws2_32/tests/sock.c | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 3c8c806..f0e8f2a 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -1731,14 +1731,17 @@ static inline BOOL supported_protocol(int protocol) /**********************************************************************/ -/* Returns the length of the converted address if successful, 0 if it was too small to - * start with. +/* Returns the length of the converted address if successful, 0 if it was too + * small to start with or unknown family or invalid address buffer. */ static unsigned int ws_sockaddr_ws2u(const struct WS_sockaddr* wsaddr, int wsaddrlen, union generic_unix_sockaddr *uaddr) { unsigned int uaddrlen = 0; + if (!wsaddr) + return 0; + switch (wsaddr->sa_family) { #ifdef HAS_IPX diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 59a23d7..b42c078 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -5841,6 +5841,11 @@ static void test_events(int useMessages) goto end; } + SetLastError(0xdeadbeef); + ret = connect(src, NULL, 0); + ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); + ok(GetLastError() == WSAEFAULT, "expected 10014, got %d\n", GetLastError()); + ret = connect(src, (struct sockaddr*)&addr, sizeof(addr)); if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) {
participants (1)
-
Alexandre Julliard