[PATCH 8/8] shell32: Avoid an unsafe iface to object cast in AddToEnumList().

Michael Stefaniuc mstefani at redhat.de
Sun Oct 9 18:04:37 CDT 2011


---
 dlls/shell32/cpanelfolder.c   |   27 ++++++++++++++-------------
 dlls/shell32/enumidlist.c     |   13 +++----------
 dlls/shell32/recyclebin.c     |    2 +-
 dlls/shell32/shell32_main.h   |    4 ++--
 dlls/shell32/shfldr_desktop.c |    4 ++--
 dlls/shell32/shfldr_fs.c      |    2 +-
 dlls/shell32/shfldr_mycomp.c  |    4 ++--
 7 files changed, 25 insertions(+), 31 deletions(-)

diff --git a/dlls/shell32/cpanelfolder.c b/dlls/shell32/cpanelfolder.c
index 15ad067..b006632 100644
--- a/dlls/shell32/cpanelfolder.c
+++ b/dlls/shell32/cpanelfolder.c
@@ -286,7 +286,7 @@ static PIDLCPanelStruct* _ILGetCPanelPointer(LPCITEMIDLIST pidl)
  /**************************************************************************
  *		ISF_ControlPanel_fnEnumObjects
  */
-static BOOL SHELL_RegisterCPanelApp(IEnumIDList* list, LPCSTR path)
+static BOOL SHELL_RegisterCPanelApp(IEnumIDListImpl *list, LPCSTR path)
 {
     LPITEMIDLIST pidl;
     CPlApplet* applet;
@@ -329,7 +329,7 @@ static BOOL SHELL_RegisterCPanelApp(IEnumIDList* list, LPCSTR path)
     return TRUE;
 }
 
-static int SHELL_RegisterRegistryCPanelApps(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath)
+static int SHELL_RegisterRegistryCPanelApps(IEnumIDListImpl *list, HKEY hkey_root, LPCSTR szRepPath)
 {
     char name[MAX_PATH];
     char value[MAX_PATH];
@@ -358,7 +358,7 @@ static int SHELL_RegisterRegistryCPanelApps(IEnumIDList* list, HKEY hkey_root, L
     return cnt;
 }
 
-static int SHELL_RegisterCPanelFolders(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath)
+static int SHELL_RegisterCPanelFolders(IEnumIDListImpl *list, HKEY hkey_root, LPCSTR szRepPath)
 {
     char name[MAX_PATH];
     HKEY hkey;
@@ -391,19 +391,18 @@ static int SHELL_RegisterCPanelFolders(IEnumIDList* list, HKEY hkey_root, LPCSTR
 /**************************************************************************
  *  CreateCPanelEnumList()
  */
-static BOOL CreateCPanelEnumList(
-    IEnumIDList * iface,
-    DWORD dwFlags)
+static BOOL CreateCPanelEnumList(IEnumIDListImpl *list, DWORD dwFlags)
 {
     CHAR szPath[MAX_PATH];
     WIN32_FIND_DATAA wfd;
     HANDLE hFile;
 
-    TRACE("(%p)->(flags=0x%08x)\n", iface, dwFlags);
+    TRACE("(%p)->(flags=0x%08x)\n", list, dwFlags);
 
     /* enumerate control panel folders */
     if (dwFlags & SHCONTF_FOLDERS)
-        SHELL_RegisterCPanelFolders(iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace");
+        SHELL_RegisterCPanelFolders(list, HKEY_LOCAL_MACHINE,
+                "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace");
 
     /* enumerate the control panel applets */
     if (dwFlags & SHCONTF_NONFOLDERS)
@@ -414,7 +413,7 @@ static BOOL CreateCPanelEnumList(
         p = PathAddBackslashA(szPath);
         strcpy(p, "*.cpl");
 
-        TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",iface,debugstr_a(szPath));
+        TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n", list, debugstr_a(szPath));
         hFile = FindFirstFileA(szPath, &wfd);
 
         if (hFile != INVALID_HANDLE_VALUE)
@@ -426,14 +425,16 @@ static BOOL CreateCPanelEnumList(
 
                 if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
                     strcpy(p, wfd.cFileName);
-                    SHELL_RegisterCPanelApp(iface, szPath);
+                    SHELL_RegisterCPanelApp(list, szPath);
                 }
             } while(FindNextFileA(hFile, &wfd));
             FindClose(hFile);
         }
 
-        SHELL_RegisterRegistryCPanelApps(iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls");
-        SHELL_RegisterRegistryCPanelApps(iface, HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls");
+        SHELL_RegisterRegistryCPanelApps(list, HKEY_LOCAL_MACHINE,
+                "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls");
+        SHELL_RegisterRegistryCPanelApps(list, HKEY_CURRENT_USER,
+                "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls");
     }
     return TRUE;
 }
@@ -451,8 +452,8 @@ static HRESULT WINAPI ISF_ControlPanel_fnEnumObjects(IShellFolder2 *iface, HWND
 
     if (!(list = IEnumIDList_Constructor()))
         return E_OUTOFMEMORY;
+    CreateCPanelEnumList(list, dwFlags);
     *ppEnumIDList = &list->IEnumIDList_iface;
-    CreateCPanelEnumList(*ppEnumIDList, dwFlags);
 
     TRACE("--(%p)->(new ID List: %p)\n", This, *ppEnumIDList);
 
diff --git a/dlls/shell32/enumidlist.c b/dlls/shell32/enumidlist.c
index 9e43ed4..8ee789b 100644
--- a/dlls/shell32/enumidlist.c
+++ b/dlls/shell32/enumidlist.c
@@ -39,17 +39,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
 /**************************************************************************
  *  AddToEnumList()
  */
-BOOL AddToEnumList(
-	IEnumIDList * iface,
-	LPITEMIDLIST pidl)
+BOOL AddToEnumList(IEnumIDListImpl *This, LPITEMIDLIST pidl)
 {
-	IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
-
         struct enumlist *pNew;
 
 	TRACE("(%p)->(pidl=%p)\n",This,pidl);
 
-    if (!iface || !pidl)
+    if (!This || !pidl)
         return FALSE;
 
         pNew = SHAlloc(sizeof(*pNew));
@@ -83,10 +79,7 @@ BOOL AddToEnumList(
 /**************************************************************************
  *  CreateFolderEnumList()
  */
-BOOL CreateFolderEnumList(
-	IEnumIDList *list,
-	LPCWSTR lpszPath,
-	DWORD dwFlags)
+BOOL CreateFolderEnumList(IEnumIDListImpl *list, LPCWSTR lpszPath, DWORD dwFlags)
 {
     LPITEMIDLIST pidl=NULL;
     WIN32_FIND_DATAW stffile;
diff --git a/dlls/shell32/recyclebin.c b/dlls/shell32/recyclebin.c
index 715be87..6b7d4aa 100644
--- a/dlls/shell32/recyclebin.c
+++ b/dlls/shell32/recyclebin.c
@@ -426,7 +426,7 @@ static HRESULT WINAPI RecycleBin_EnumObjects(IShellFolder2 *iface, HWND hwnd, SH
         if (FAILED(ret = TRASH_EnumItems(&pidls, &pidls_count)))
             goto failed;
         for (i=0; i<pidls_count; i++)
-            if (!AddToEnumList(&list->IEnumIDList_iface, pidls[i]))
+            if (!AddToEnumList(list, pidls[i]))
                 goto failed;
     }
 
diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h
index 18ddf71..dd5f1ab 100644
--- a/dlls/shell32/shell32_main.h
+++ b/dlls/shell32/shell32_main.h
@@ -223,11 +223,11 @@ typedef struct
 
 /* Creates an IEnumIDList; add LPITEMIDLISTs to it with AddToEnumList. */
 IEnumIDListImpl *IEnumIDList_Constructor(void) DECLSPEC_HIDDEN;
-BOOL AddToEnumList(IEnumIDList *list, LPITEMIDLIST pidl) DECLSPEC_HIDDEN;
+BOOL AddToEnumList(IEnumIDListImpl *list, LPITEMIDLIST pidl) DECLSPEC_HIDDEN;
 
 /* Enumerates the folders and/or files (depending on dwFlags) in lpszPath and
  * adds them to the already-created list.
  */
-BOOL CreateFolderEnumList(IEnumIDList *list, LPCWSTR lpszPath, DWORD dwFlags) DECLSPEC_HIDDEN;
+BOOL CreateFolderEnumList(IEnumIDListImpl *list, LPCWSTR lpszPath, DWORD dwFlags) DECLSPEC_HIDDEN;
 
 #endif
diff --git a/dlls/shell32/shfldr_desktop.c b/dlls/shell32/shfldr_desktop.c
index 2ea5244..5b90260 100644
--- a/dlls/shell32/shfldr_desktop.c
+++ b/dlls/shell32/shfldr_desktop.c
@@ -286,7 +286,7 @@ static const WCHAR Desktop_NameSpaceW[] = { 'S','O','F','T','W','A','R','E',
  'o','r','e','r','\\','D','e','s','k','t','o','p','\\','N','a','m','e','s','p',
  'a','c','e','\0' };
 
-static BOOL CreateDesktopEnumList(IEnumIDList *list, DWORD dwFlags)
+static BOOL CreateDesktopEnumList(IEnumIDListImpl *list, DWORD dwFlags)
 {
     BOOL ret = TRUE;
     WCHAR szPath[MAX_PATH];
@@ -352,8 +352,8 @@ static HRESULT WINAPI ISF_Desktop_fnEnumObjects (IShellFolder2 * iface,
 
     if (!(list = IEnumIDList_Constructor()))
         return E_OUTOFMEMORY;
+    CreateDesktopEnumList(list, dwFlags);
     *ppEnumIDList = &list->IEnumIDList_iface;
-    CreateDesktopEnumList(*ppEnumIDList, dwFlags);
 
     TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
 
diff --git a/dlls/shell32/shfldr_fs.c b/dlls/shell32/shfldr_fs.c
index 3556a62..b591533 100644
--- a/dlls/shell32/shfldr_fs.c
+++ b/dlls/shell32/shfldr_fs.c
@@ -455,8 +455,8 @@ IShellFolder_fnEnumObjects (IShellFolder2 * iface, HWND hwndOwner,
 
     if (!(list = IEnumIDList_Constructor()))
         return E_OUTOFMEMORY;
+    CreateFolderEnumList(list, This->sPathTarget, dwFlags);
     *ppEnumIDList = &list->IEnumIDList_iface;
-    CreateFolderEnumList(*ppEnumIDList, This->sPathTarget, dwFlags);
 
     TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
 
diff --git a/dlls/shell32/shfldr_mycomp.c b/dlls/shell32/shfldr_mycomp.c
index 9afb4d8..d32f975 100644
--- a/dlls/shell32/shfldr_mycomp.c
+++ b/dlls/shell32/shfldr_mycomp.c
@@ -292,7 +292,7 @@ static const WCHAR MyComputer_NameSpaceW[] = { 'S','O','F','T','W','A','R','E',
  'o','r','e','r','\\','M','y','C','o','m','p','u','t','e','r','\\','N','a','m',
  'e','s','p','a','c','e','\0' };
 
-static BOOL CreateMyCompEnumList(IEnumIDList *list, DWORD dwFlags)
+static BOOL CreateMyCompEnumList(IEnumIDListImpl *list, DWORD dwFlags)
 {
     BOOL ret = TRUE;
 
@@ -362,8 +362,8 @@ static HRESULT WINAPI ISF_MyComputer_fnEnumObjects (IShellFolder2 *iface,
 
     if (!(list = IEnumIDList_Constructor()))
         return E_OUTOFMEMORY;
+    CreateMyCompEnumList(list, dwFlags);
     *ppEnumIDList = &list->IEnumIDList_iface;
-    CreateMyCompEnumList(*ppEnumIDList, dwFlags);
 
     TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
 
-- 
1.7.6.4



More information about the wine-patches mailing list