Module: wine Branch: master Commit: 2c9a5900e630ffa71f5332a41dd4b2392de30807 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2c9a5900e630ffa71f5332a41d...
Author: Andrew Nguyen arethusa26@gmail.com Date: Sun Mar 14 11:03:58 2010 -0600
dxdiagn: Fix return and output behavior of IDxDiagContainer::EnumChildContainerNames.
---
dlls/dxdiagn/container.c | 15 +++++------ dlls/dxdiagn/tests/container.c | 49 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 8 deletions(-)
diff --git a/dlls/dxdiagn/container.c b/dlls/dxdiagn/container.c index e02d1d1..e2b3af1 100644 --- a/dlls/dxdiagn/container.c +++ b/dlls/dxdiagn/container.c @@ -88,16 +88,13 @@ static HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames(PDXDIAGCONTAI IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface; IDxDiagContainerImpl_SubContainer* p = NULL; DWORD i = 0; - - TRACE("(%p, %u, %s, %u)\n", iface, dwIndex, debugstr_w(pwszContainer), cchContainer);
- if (NULL == pwszContainer) { + TRACE("(%p, %u, %p, %u)\n", iface, dwIndex, pwszContainer, cchContainer); + + if (NULL == pwszContainer || 0 == cchContainer) { return E_INVALIDARG; } - if (256 > cchContainer) { - return DXDIAG_E_INSUFFICIENT_BUFFER; - } - + p = This->subContainers; while (NULL != p) { if (dwIndex == i) { @@ -109,7 +106,9 @@ static HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames(PDXDIAGCONTAI } p = p->next; ++i; - } + } + + *pwszContainer = '\0'; return E_INVALIDARG; }
diff --git a/dlls/dxdiagn/tests/container.c b/dlls/dxdiagn/tests/container.c index b2aa4fc..9ca464b 100644 --- a/dlls/dxdiagn/tests/container.c +++ b/dlls/dxdiagn/tests/container.c @@ -99,10 +99,59 @@ static void test_GetNumberOfProps(void) IDxDiagProvider_Release(pddp); }
+static void test_EnumChildContainerNames(void) +{ + HRESULT hr; + WCHAR container[256]; + static const WCHAR testW[] = {'t','e','s','t',0}; + static const WCHAR zerotestW[] = {0,'e','s','t',0}; + + if (!create_root_IDxDiagContainer()) + { + skip("Unable to create the root IDxDiagContainer\n"); + return; + } + + /* Test various combinations of invalid parameters. */ + hr = IDxDiagContainer_EnumChildContainerNames(pddc, 0, NULL, 0); + ok(hr == E_INVALIDARG, + "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr); + + hr = IDxDiagContainer_EnumChildContainerNames(pddc, 0, NULL, sizeof(container)/sizeof(WCHAR)); + ok(hr == E_INVALIDARG, + "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr); + + /* Test the conditions in which the output buffer can be modified. */ + memcpy(container, testW, sizeof(testW)); + hr = IDxDiagContainer_EnumChildContainerNames(pddc, 0, container, 0); + ok(hr == E_INVALIDARG, + "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr); + ok(!memcmp(container, testW, sizeof(testW)), + "Expected the container buffer to be untouched, got %s\n", wine_dbgstr_w(container)); + + memcpy(container, testW, sizeof(testW)); + hr = IDxDiagContainer_EnumChildContainerNames(pddc, ~0, container, 0); + ok(hr == E_INVALIDARG, + "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr); + ok(!memcmp(container, testW, sizeof(testW)), + "Expected the container buffer to be untouched, got %s\n", wine_dbgstr_w(container)); + + memcpy(container, testW, sizeof(testW)); + hr = IDxDiagContainer_EnumChildContainerNames(pddc, ~0, container, sizeof(container)/sizeof(WCHAR)); + ok(hr == E_INVALIDARG, + "Expected IDxDiagContainer::EnumChildContainerNames to return E_INVALIDARG, got 0x%08x\n", hr); + ok(!memcmp(container, zerotestW, sizeof(zerotestW)), + "Expected the container buffer string to be empty, got %s\n", wine_dbgstr_w(container)); + + IDxDiagContainer_Release(pddc); + IDxDiagProvider_Release(pddp); +} + START_TEST(container) { CoInitialize(NULL); test_GetNumberOfChildContainers(); test_GetNumberOfProps(); + test_EnumChildContainerNames(); CoUninitialize(); }