Michael Stefaniuc : shell32: Avoid an unsafe iface to object cast in AddToEnumList().
Module: wine Branch: master Commit: 28d8819b63220dd7786c68a04bc626e4607428d3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=28d8819b63220dd7786c68a04b... Author: Michael Stefaniuc <mstefani(a)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);
participants (1)
-
Alexandre Julliard