ws2_32: Avoid a crash with an optional pointer in WSAAsyncGetServByPort.
This commit is contained in:
parent
2c74796456
commit
9edafeb742
|
@ -407,7 +407,7 @@ HANDLE WINAPI WSAAsyncGetServByPort(HWND hWnd, UINT uMsg, INT port,
|
||||||
LPCSTR proto, LPSTR sbuf, INT buflen)
|
LPCSTR proto, LPSTR sbuf, INT buflen)
|
||||||
{
|
{
|
||||||
struct async_query_getservbyport *aq;
|
struct async_query_getservbyport *aq;
|
||||||
unsigned int len = strlen(proto) + 1;
|
unsigned int len = proto ? strlen(proto) + 1 : 0;
|
||||||
|
|
||||||
TRACE("hwnd %p, msg %04x, port %i, proto %s\n", hWnd, uMsg, port, debugstr_a(proto));
|
TRACE("hwnd %p, msg %04x, port %i, proto %s\n", hWnd, uMsg, port, debugstr_a(proto));
|
||||||
|
|
||||||
|
@ -416,9 +416,17 @@ HANDLE WINAPI WSAAsyncGetServByPort(HWND hWnd, UINT uMsg, INT port,
|
||||||
SetLastError( WSAEWOULDBLOCK );
|
SetLastError( WSAEWOULDBLOCK );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
aq->serv_proto = (char *)(aq + 1);
|
|
||||||
aq->serv_port = port;
|
if (proto)
|
||||||
strcpy( aq->serv_proto, proto );
|
{
|
||||||
|
aq->serv_proto = (char *)(aq + 1);
|
||||||
|
strcpy( aq->serv_proto, proto );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
aq->serv_proto = NULL;
|
||||||
|
|
||||||
|
aq->serv_port = port;
|
||||||
|
|
||||||
return run_query( hWnd, uMsg, async_getservbyport, &aq->query, sbuf, buflen );
|
return run_query( hWnd, uMsg, async_getservbyport, &aq->query, sbuf, buflen );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4810,6 +4810,67 @@ static void test_synchronous_WSAIoctl(void)
|
||||||
CloseHandle( previous_port );
|
CloseHandle( previous_port );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define WM_ASYNCCOMPLETE (WM_USER + 100)
|
||||||
|
static HWND create_async_message_window(void)
|
||||||
|
{
|
||||||
|
static const char class_name[] = "ws2_32 async message window class";
|
||||||
|
|
||||||
|
WNDCLASSEXA wndclass;
|
||||||
|
HWND hWnd;
|
||||||
|
|
||||||
|
wndclass.cbSize = sizeof(wndclass);
|
||||||
|
wndclass.style = CS_HREDRAW | CS_VREDRAW;
|
||||||
|
wndclass.lpfnWndProc = DefWindowProcA;
|
||||||
|
wndclass.cbClsExtra = 0;
|
||||||
|
wndclass.cbWndExtra = 0;
|
||||||
|
wndclass.hInstance = GetModuleHandleA(NULL);
|
||||||
|
wndclass.hIcon = LoadIconA(NULL, IDI_APPLICATION);
|
||||||
|
wndclass.hIconSm = LoadIconA(NULL, IDI_APPLICATION);
|
||||||
|
wndclass.hCursor = LoadCursorA(NULL, IDC_ARROW);
|
||||||
|
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
||||||
|
wndclass.lpszClassName = class_name;
|
||||||
|
wndclass.lpszMenuName = NULL;
|
||||||
|
|
||||||
|
RegisterClassExA(&wndclass);
|
||||||
|
|
||||||
|
hWnd = CreateWindow(class_name, "ws2_32 async message window", WS_OVERLAPPEDWINDOW,
|
||||||
|
0, 0, 500, 500, NULL, NULL, GetModuleHandleA(NULL), NULL);
|
||||||
|
if (!hWnd)
|
||||||
|
{
|
||||||
|
ok(0, "failed to create window: %u\n", GetLastError());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hWnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_WSAAsyncGetServByPort(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 = WSAAsyncGetServByPort(NULL, 0, 0, NULL, NULL, 0);
|
||||||
|
ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
|
||||||
|
|
||||||
|
ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, 0, NULL, NULL, 0);
|
||||||
|
ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
|
||||||
|
|
||||||
|
ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, htons(80), NULL, NULL, 0);
|
||||||
|
ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
|
||||||
|
|
||||||
|
ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, htons(80), NULL, buffer, MAXGETHOSTSTRUCT);
|
||||||
|
ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
|
||||||
|
|
||||||
|
DestroyWindow(hwnd);
|
||||||
|
}
|
||||||
|
|
||||||
/**************** Main program ***************/
|
/**************** Main program ***************/
|
||||||
|
|
||||||
START_TEST( sock )
|
START_TEST( sock )
|
||||||
|
@ -4870,6 +4931,8 @@ START_TEST( sock )
|
||||||
|
|
||||||
test_sioRoutingInterfaceQuery();
|
test_sioRoutingInterfaceQuery();
|
||||||
|
|
||||||
|
test_WSAAsyncGetServByPort();
|
||||||
|
|
||||||
/* this is a io heavy test, do it at the end so the kernel doesn't start dropping packets */
|
/* this is a io heavy test, do it at the end so the kernel doesn't start dropping packets */
|
||||||
test_send();
|
test_send();
|
||||||
test_synchronous_WSAIoctl();
|
test_synchronous_WSAIoctl();
|
||||||
|
|
Loading…
Reference in New Issue