Module: wine Branch: master Commit: f1e005410f968a1e0b3d97dcf320759b6385fc85 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f1e005410f968a1e0b3d97dcf3...
Author: Andrew Nguyen arethusa26@gmail.com Date: Sun Mar 14 11:04:20 2010 -0600
dxdiagn: Fix return and output behavior of IDxDiagContainer::EnumPropNames.
---
dlls/dxdiagn/container.c | 13 ++---- dlls/dxdiagn/tests/container.c | 81 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 8 deletions(-)
diff --git a/dlls/dxdiagn/container.c b/dlls/dxdiagn/container.c index c684e97..3829bb8 100644 --- a/dlls/dxdiagn/container.c +++ b/dlls/dxdiagn/container.c @@ -187,16 +187,13 @@ static HRESULT WINAPI IDxDiagContainerImpl_EnumPropNames(PDXDIAGCONTAINER iface, IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface; IDxDiagContainerImpl_Property* p = NULL; DWORD i = 0; - - TRACE("(%p, %u, %s, %u)\n", iface, dwIndex, debugstr_w(pwszPropName), cchPropName);
- if (NULL == pwszPropName) { + TRACE("(%p, %u, %p, %u)\n", iface, dwIndex, pwszPropName, cchPropName); + + if (NULL == pwszPropName || 0 == cchPropName) { return E_INVALIDARG; } - if (256 > cchPropName) { - return DXDIAG_E_INSUFFICIENT_BUFFER; - } - + p = This->properties; while (NULL != p) { if (dwIndex == i) { @@ -208,7 +205,7 @@ static HRESULT WINAPI IDxDiagContainerImpl_EnumPropNames(PDXDIAGCONTAINER iface, } p = p->next; ++i; - } + } return E_INVALIDARG; }
diff --git a/dlls/dxdiagn/tests/container.c b/dlls/dxdiagn/tests/container.c index d2ed43f..d1541e3 100644 --- a/dlls/dxdiagn/tests/container.c +++ b/dlls/dxdiagn/tests/container.c @@ -387,6 +387,86 @@ cleanup: IDxDiagProvider_Release(pddp); }
+static void test_EnumPropNames(void) +{ + HRESULT hr; + WCHAR container[256], property[256]; + IDxDiagContainer *child = NULL; + DWORD count, index, propcount; + 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; + } + + /* Find a container with a non-zero number of properties. */ + hr = IDxDiagContainer_GetNumberOfChildContainers(pddc, &count); + ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr); + if (FAILED(hr)) + { + skip("IDxDiagContainer::GetNumberOfChildContainers failed\n"); + goto cleanup; + } + + for (index = 0; index < count; index++) + { + hr = IDxDiagContainer_EnumChildContainerNames(pddc, index, container, sizeof(container)/sizeof(WCHAR)); + ok(hr == S_OK, "Expected IDxDiagContainer_EnumChildContainerNames to return S_OK, got 0x%08x\n", hr); + if (FAILED(hr)) + { + skip("IDxDiagContainer::EnumChildContainerNames failed\n"); + goto cleanup; + } + + hr = IDxDiagContainer_GetChildContainer(pddc, container, &child); + ok(hr == S_OK, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr); + + if (SUCCEEDED(hr)) + { + hr = IDxDiagContainer_GetNumberOfProps(child, &propcount); + ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfProps to return S_OK, got 0x%08x\n", hr); + + if (!propcount) + { + IDxDiagContainer_Release(child); + child = NULL; + } + else + break; + } + } + + if (!child) + { + skip("Unable to find a container with non-zero property count\n"); + goto cleanup; + } + + hr = IDxDiagContainer_EnumPropNames(child, ~0, NULL, 0); + ok(hr == E_INVALIDARG, "Expected IDxDiagContainer::EnumPropNames to return E_INVALIDARG, got 0x%08x\n", hr); + + memcpy(property, testW, sizeof(testW)); + hr = IDxDiagContainer_EnumPropNames(child, ~0, property, 0); + ok(hr == E_INVALIDARG, "Expected IDxDiagContainer::EnumPropNames to return E_INVALIDARG, got 0x%08x\n", hr); + ok(!memcmp(property, testW, sizeof(testW)), + "Expected the property buffer to be unchanged, got %s\n", wine_dbgstr_w(property)); + + memcpy(property, testW, sizeof(testW)); + hr = IDxDiagContainer_EnumPropNames(child, ~0, property, sizeof(property)/sizeof(WCHAR)); + ok(hr == E_INVALIDARG, "Expected IDxDiagContainer::EnumPropNames to return E_INVALIDARG, got 0x%08x\n", hr); + ok(!memcmp(property, testW, sizeof(testW)), + "Expected the property buffer to be unchanged, got %s\n", wine_dbgstr_w(property)); + + IDxDiagContainer_Release(child); + +cleanup: + IDxDiagContainer_Release(pddc); + IDxDiagProvider_Release(pddp); +} + START_TEST(container) { CoInitialize(NULL); @@ -395,5 +475,6 @@ START_TEST(container) test_EnumChildContainerNames(); test_GetChildContainer(); test_dot_parsing(); + test_EnumPropNames(); CoUninitialize(); }