Module: wine Branch: master Commit: 28d8819b63220dd7786c68a04bc626e4607428d3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=28d8819b63220dd7786c68a04b...
Author: Michael Stefaniuc mstefani@redhat.de Date: Mon Oct 10 01:04:37 2011 +0200
shell32: Avoid an unsafe iface to object cast in AddToEnumList().
---
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);