From fdfef818ef5dcb4d0132da8fe4e91eb00415db24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Thu, 6 Jun 2019 16:33:44 +0200 Subject: [PATCH] [BROWSEUI] Fix CSHEnumClassesOfCategories::Initialize() parameters validation. (#1559) CORE-11711 --- .../shellbars/CSHEnumClassesOfCategories.cpp | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/dll/win32/browseui/shellbars/CSHEnumClassesOfCategories.cpp b/dll/win32/browseui/shellbars/CSHEnumClassesOfCategories.cpp index c2915a725fc..7f448a2f1ce 100644 --- a/dll/win32/browseui/shellbars/CSHEnumClassesOfCategories.cpp +++ b/dll/win32/browseui/shellbars/CSHEnumClassesOfCategories.cpp @@ -254,17 +254,16 @@ HRESULT CSHEnumClassesOfCategories::Initialize(ULONG cImplemented, CATID *pImple if (!fDsa) return E_FAIL; - if (cRequired > 0 || cImplemented == (ULONG)-1) - { - FIXME("Implement required categories class enumeration\n"); - return E_NOTIMPL; - } + // Parameter validation: + // - We must have at least one category to manage. + // - The array pointers must not be NULL if there is a non-zero + // element count specified for them. + if (cImplemented == 0 && cRequired == 0) + return E_INVALIDARG; + if ((cImplemented && !pImplemented) || (cRequired && !pRequired)) + return E_INVALIDARG; - // Don't do anything if we have nothing - if (cRequired == 0 && cImplemented == (ULONG)-1) - return E_FAIL; - - // For each implemented category, create a cache and add it to our local DSA + // For each implemented category, create a cache and add it to our local DSA. for (i = 0; i < cImplemented; i++) { CComCatCachedCategory cachedCat; @@ -273,6 +272,17 @@ HRESULT CSHEnumClassesOfCategories::Initialize(ULONG cImplemented, CATID *pImple return hr; cachedCat.WriteCacheToDSA(fDsa); } + + // TODO: Implement caching of the required categories. + if (cRequired > 0) + { + FIXME("Implement required categories class enumeration\n"); + + // Only fail in case we didn't look at the implemented categories. + if (cImplemented == 0) + return E_NOTIMPL; + } + return S_OK; }