From: Bruno Jesus <00cpxxx@gmail.com> Subject: ws2_32: Handle NULL proto in WSAAsyncGetServByName Message-Id: Date: Fri, 23 Mar 2012 01:19:33 -0300 From 8f4199c7e29ce9e1e1db281277a413116312fd96 Mon Sep 17 00:00:00 2001 From: Bruno Jesus <00cpxxx@gmail.com> Date: Fri, 23 Mar 2012 00:23:48 -0300 Subject: ws2_32: Handle NULL proto in WSAAsyncGetServByName Following the same approach from WSAAsyncGetServByPort. Fixes bug 19435. Tested in linux and osx. --- dlls/ws2_32/async.c | 14 +++++++++++--- dlls/ws2_32/tests/sock.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/dlls/ws2_32/async.c b/dlls/ws2_32/async.c index cc330bb..573349f 100644 --- a/dlls/ws2_32/async.c +++ b/dlls/ws2_32/async.c @@ -384,7 +384,7 @@ HANDLE WINAPI WSAAsyncGetServByName(HWND hWnd, UINT uMsg, LPCSTR name, { struct async_query_getservbyname *aq; unsigned int len1 = strlen(name) + 1; - unsigned int len2 = strlen(proto) + 1; + unsigned int len2 = proto ? strlen(proto) + 1 : 0; TRACE("hwnd %p, msg %04x, name %s, proto %s\n", hWnd, uMsg, debugstr_a(name), debugstr_a(proto)); @@ -393,10 +393,18 @@ HANDLE WINAPI WSAAsyncGetServByName(HWND hWnd, UINT uMsg, LPCSTR name, SetLastError( WSAEWOULDBLOCK ); return 0; } + aq->serv_name = (char *)(aq + 1); - aq->serv_proto = aq->serv_name + len1; strcpy( aq->serv_name, name ); - strcpy( aq->serv_proto, proto ); + + if (proto) + { + aq->serv_proto = aq->serv_name + len1; + strcpy( aq->serv_proto, proto ); + } + else + aq->serv_proto = NULL; + return run_query( hWnd, uMsg, async_getservbyname, &aq->query, sbuf, buflen ); } diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index c42de2f..36712ee 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -5205,6 +5205,33 @@ static void test_WSAAsyncGetServByPort(void) DestroyWindow(hwnd); } +static void test_WSAAsyncGetServByName(void) +{ + HWND hwnd = create_async_message_window(); + HANDLE ret; + char buffer[MAXGETHOSTSTRUCT]; + + if (!hwnd) + return; + + /* FIXME: The asynchronous window messages should be tested. */ + + /* Parameters are not checked when initiating the asynchronous operation. */ + ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "", NULL, NULL, 0); + ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n"); + + ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "", "", buffer, MAXGETHOSTSTRUCT); + ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n"); + + ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "http", NULL, NULL, 0); + ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n"); + + ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "http", "tcp", buffer, MAXGETHOSTSTRUCT); + ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n"); + + DestroyWindow(hwnd); +} + static void test_completion_port(void) { HANDLE previous_port, io_port; @@ -5772,6 +5799,7 @@ START_TEST( sock ) test_sioRoutingInterfaceQuery(); test_WSAAsyncGetServByPort(); + test_WSAAsyncGetServByName(); test_completion_port(); -- 1.7.2.5