Alistair Leslie-Hughes : dpnet: Add basic validation in IDirectPlay8Client EnumHosts.

Alexandre Julliard julliard at winehq.org
Wed Feb 15 16:06:24 CST 2017


Module: wine
Branch: master
Commit: 6eb0015d0896b217a80205c0f5bdbd8ece4a3c6b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6eb0015d0896b217a80205c0f5bdbd8ece4a3c6b

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Wed Feb 15 04:36:03 2017 +0000

dpnet: Add basic validation in IDirectPlay8Client EnumHosts.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dpnet/client.c       | 18 +++++++++++++++---
 dlls/dpnet/tests/client.c | 14 +++++++-------
 dlls/dpnet/tests/thread.c |  4 ++--
 3 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/dlls/dpnet/client.c b/dlls/dpnet/client.c
index d1e6b3b..3b3361f 100644
--- a/dlls/dpnet/client.c
+++ b/dlls/dpnet/client.c
@@ -144,9 +144,21 @@ static HRESULT WINAPI IDirectPlay8ClientImpl_EnumHosts(IDirectPlay8Client *iface
         const DWORD dwTimeOut, void * const pvUserContext, DPNHANDLE * const pAsyncHandle,
         const DWORD dwFlags)
 {
-  IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
-  FIXME("(%p):(%p,%p,%x): Stub\n", This, pvUserContext, pAsyncHandle, dwFlags);
-  return DPN_OK; 
+    IDirectPlay8ClientImpl *This = impl_from_IDirectPlay8Client(iface);
+
+    FIXME("(%p):(%p,%p,%p,%p,%u,%u,%u,%u,%p,%p,%x)\n", This, pApplicationDesc, pAddrHost, pDeviceInfo, pUserEnumData,
+        dwUserEnumDataSize, dwEnumCount, dwRetryInterval, dwTimeOut, pvUserContext, pAsyncHandle, dwFlags);
+
+    if(!This->msghandler)
+        return DPNERR_UNINITIALIZED;
+
+    if((dwFlags & DPNENUMHOSTS_SYNC) && pAsyncHandle)
+        return DPNERR_INVALIDPARAM;
+
+    if(dwUserEnumDataSize > This->spcaps.dwMaxEnumPayloadSize)
+        return DPNERR_ENUMQUERYTOOLARGE;
+
+    return (dwFlags & DPNENUMHOSTS_SYNC) ? DPN_OK : DPNSUCCESS_PENDING;
 }
 
 static HRESULT WINAPI IDirectPlay8ClientImpl_CancelAsyncOperation(IDirectPlay8Client *iface,
diff --git a/dlls/dpnet/tests/client.c b/dlls/dpnet/tests/client.c
index ca16f57..0c3f9ed 100644
--- a/dlls/dpnet/tests/client.c
+++ b/dlls/dpnet/tests/client.c
@@ -254,22 +254,22 @@ static void test_enum_hosts(void)
     data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, caps.dwMaxEnumPayloadSize + 1);
 
     hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, NULL, 0, 2, 1000, 1000, NULL,  &async, DPNENUMHOSTS_SYNC);
-    todo_wine ok(hr == DPNERR_INVALIDPARAM, "got 0x%08x\n", hr);
+    ok(hr == DPNERR_INVALIDPARAM, "got 0x%08x\n", hr);
 
     hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, data, caps.dwMaxEnumPayloadSize + 1,
                                         INFINITE, 0, INFINITE, NULL,  &async, DPNENUMHOSTS_SYNC);
-    todo_wine ok(hr == DPNERR_INVALIDPARAM, "got 0x%08x\n", hr);
+    ok(hr == DPNERR_INVALIDPARAM, "got 0x%08x\n", hr);
 
     async = 0;
     hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, data, caps.dwMaxEnumPayloadSize + 1, INFINITE, 0,
                                         INFINITE, NULL,  &async, 0);
-    todo_wine ok(hr == DPNERR_ENUMQUERYTOOLARGE, "got 0x%08x\n", hr);
+    ok(hr == DPNERR_ENUMQUERYTOOLARGE, "got 0x%08x\n", hr);
     ok(!async, "Handle returned\n");
 
     async = 0;
     hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, data, caps.dwMaxEnumPayloadSize, INFINITE, 0, INFINITE,
                                         NULL,  &async, 0);
-    todo_wine ok(hr == DPNSUCCESS_PENDING, "got 0x%08x\n", hr);
+    ok(hr == DPNSUCCESS_PENDING, "got 0x%08x\n", hr);
     todo_wine ok(async, "No Handle returned\n");
 
     /* This CancelAsyncOperation doesn't generate a DPN_MSGID_ASYNC_OP_COMPLETE */
@@ -279,15 +279,15 @@ static void test_enum_hosts(void)
 
     /* No Initialize has been called on client2. */
     hr = IDirectPlay8Client_EnumHosts(client2, &appdesc, host, local, NULL, 0, INFINITE, 0, INFINITE, NULL,  &async, 0);
-    todo_wine ok(hr == DPNERR_UNINITIALIZED, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
+    ok(hr == DPNERR_UNINITIALIZED, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
 
     /* Since we are running asynchronously, EnumHosts returns DPNSUCCESS_PENDING. */
     hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, NULL, 0, INFINITE, 0, INFINITE, NULL,  &async, 0);
-    todo_wine ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
+    ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
     todo_wine ok(async, "No Handle returned\n");
 
     hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, NULL, 0, INFINITE, 0, INFINITE, NULL,  &async2, 0);
-    todo_wine ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
+    ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
     todo_wine ok(async2, "No Handle returned\n");
     todo_wine ok(async2 != async, "Same handle returned.\n");
 
diff --git a/dlls/dpnet/tests/thread.c b/dlls/dpnet/tests/thread.c
index edcab25..ce1b144 100644
--- a/dlls/dpnet/tests/thread.c
+++ b/dlls/dpnet/tests/thread.c
@@ -164,7 +164,7 @@ static void test_enum_hosts(void)
     ok(hr == S_OK, "IDirectPlay8Address failed with 0x%08x\n", hr);
 
     hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, NULL, 0, INFINITE, 0, INFINITE, NULL,  &async, 0);
-    todo_wine ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
+    ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
     todo_wine ok(async, "No Handle returned\n");
 
     hr = IDirectPlay8ThreadPool_GetThreadCount(pool1, -1, &threadcnt, 0);
@@ -172,7 +172,7 @@ static void test_enum_hosts(void)
     todo_wine ok(threadcnt == 6, "got %d\n", threadcnt);
 
     hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, NULL, 0, INFINITE, 0, INFINITE, NULL,  &async2, 0);
-    todo_wine ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
+    ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr);
 
     WaitForSingleObject(enumevent, 1000);
 




More information about the wine-cvs mailing list