shell32 patch 11

Martin Fuchs martin-fuchs at gmx.net
Tue Jan 20 15:47:59 CST 2004


Changelog:
- SHGetDataFromIDListA/W(): handle drives when retrieving file attributes
- fixed error handling to avoid GPFs


Index: pidl.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/pidl.c,v
retrieving revision 1.96
diff -u -p -d -r1.96 pidl.c
--- pidl.c	18 Jan 2004 22:08:46 -0000	1.96
+++ pidl.c	20 Jan 2004 21:46:38 -0000
@@ -1144,16 +1144,31 @@ HRESULT WINAPI SHGetDataFromIDListA(LPSH
 	{
 	  case SHGDFIL_FINDDATA:
 	    {
+	       LPSTR filename, shortname;
 	       WIN32_FIND_DATAA * pfd = dest;
 
+	       if (_ILIsDrive(pidl))
+	           return E_INVALIDARG;
+
 	       if (len < (int)sizeof(WIN32_FIND_DATAA)) return E_INVALIDARG;
 
 	       ZeroMemory(pfd, sizeof (WIN32_FIND_DATAA));
 	       _ILGetFileDateTime( pidl, &(pfd->ftLastWriteTime));
 	       pfd->dwFileAttributes = _ILGetFileAttributes(pidl, NULL, 0);
 	       pfd->nFileSizeLow = _ILGetFileSize ( pidl, NULL, 0);
-	       lstrcpynA(pfd->cFileName,_ILGetTextPointer(pidl), MAX_PATH);
-	       lstrcpynA(pfd->cAlternateFileName,_ILGetSTextPointer(pidl), 14);
+
+	       filename = _ILGetTextPointer(pidl);
+	       shortname = _ILGetSTextPointer(pidl);
+
+	       if (filename)
+	           lstrcpynA(pfd->cFileName, filename, MAX_PATH);
+	       else
+	           pfd->cFileName[0] = '\0';
+
+	       if (shortname)
+	           lstrcpynA(pfd->cAlternateFileName, shortname, MAX_PATH);
+	       else
+	           pfd->cAlternateFileName[0] = '\0';
 	    }
 	    return NOERROR;
 
@@ -1168,6 +1183,7 @@ HRESULT WINAPI SHGetDataFromIDListA(LPSH
 
 	return E_INVALIDARG;
 }
+
 /*************************************************************************
  * SHGetDataFromIDListW [SHELL32.248]
  *
@@ -1184,20 +1200,31 @@ HRESULT WINAPI SHGetDataFromIDListW(LPSH
 	{
 	  case SHGDFIL_FINDDATA:
 	    {
+	       LPSTR filename, shortname;
 	       WIN32_FIND_DATAW * pfd = dest;
 
+	       if (_ILIsDrive(pidl))
+	           return E_INVALIDARG;
+
 	       if (len < (int)sizeof(WIN32_FIND_DATAW)) return E_INVALIDARG;
 
 	       ZeroMemory(pfd, sizeof (WIN32_FIND_DATAA));
 	       _ILGetFileDateTime( pidl, &(pfd->ftLastWriteTime));
 	       pfd->dwFileAttributes = _ILGetFileAttributes(pidl, NULL, 0);
 	       pfd->nFileSizeLow = _ILGetFileSize ( pidl, NULL, 0);
-               if (!MultiByteToWideChar( CP_ACP, 0, _ILGetTextPointer(pidl), -1,
-                                         pfd->cFileName, MAX_PATH ))
-                   pfd->cFileName[MAX_PATH-1] = 0;
-               if (!MultiByteToWideChar( CP_ACP, 0, _ILGetSTextPointer(pidl), -1,
-                                         pfd->cAlternateFileName, 14 ))
-                   pfd->cFileName[13] = 0;
+
+	       filename = _ILGetTextPointer(pidl);
+	       shortname = _ILGetSTextPointer(pidl);
+
+	       if (!filename)
+	           pfd->cFileName[0] = '\0';
+	       else if (!MultiByteToWideChar(CP_ACP, 0, filename, -1, pfd->cFileName, MAX_PATH))
+	           pfd->cFileName[MAX_PATH-1] = 0;
+
+	       if (!shortname)
+	           pfd->cAlternateFileName[0] = '\0';
+	       else if (!MultiByteToWideChar(CP_ACP, 0, shortname, -1, pfd->cAlternateFileName, 14))
+	           pfd->cAlternateFileName[13] = 0;
 	    }
 	    return NOERROR;
 	  case SHGDFIL_NETRESOURCE:





More information about the wine-patches mailing list