Nikolay Sivov : shell32: Stop using fixed size buffers for display names.

Alexandre Julliard julliard at winehq.org
Thu Sep 28 18:36:35 CDT 2017


Module: wine
Branch: master
Commit: 8b661a18e322ef7666a22255c91b6f9d900eff3d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8b661a18e322ef7666a22255c91b6f9d900eff3d

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Sep 28 11:25:46 2017 +0300

shell32: Stop using fixed size buffers for display names.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/shell32/shelldispatch.c | 52 ++++++++++++++++++++------------------------
 1 file changed, 24 insertions(+), 28 deletions(-)

diff --git a/dlls/shell32/shelldispatch.c b/dlls/shell32/shelldispatch.c
index 9c35b06..82fc9ac 100644
--- a/dlls/shell32/shelldispatch.c
+++ b/dlls/shell32/shelldispatch.c
@@ -66,14 +66,14 @@ typedef struct {
     IDispatch *application;
     IShellFolder2 *folder;
     PIDLIST_ABSOLUTE pidl;
-    WCHAR path[MAX_PATH];
+    BSTR path;
 } FolderImpl;
 
 typedef struct {
     FolderItems3 FolderItems3_iface;
     LONG ref;
     FolderImpl *folder;
-    WCHAR **item_names;
+    BSTR *item_names;
     LONG item_count;
 } FolderItemsImpl;
 
@@ -1030,7 +1030,7 @@ static ULONG WINAPI FolderItemsImpl_Release(FolderItems3 *iface)
     {
         Folder3_Release(&This->folder->Folder3_iface);
         for (i = 0; i < This->item_count; i++)
-            HeapFree(GetProcessHeap(), 0, This->item_names[i]);
+            SysFreeString(This->item_names[i]);
         HeapFree(GetProcessHeap(), 0, This->item_names);
         HeapFree(GetProcessHeap(), 0, This);
     }
@@ -1132,7 +1132,7 @@ static HRESULT WINAPI FolderItemsImpl_get_Parent(FolderItems3 *iface, IDispatch
 static HRESULT WINAPI FolderItemsImpl_Item(FolderItems3 *iface, VARIANT index, FolderItem **item)
 {
     FolderItemsImpl *This = impl_from_FolderItems(iface);
-    WCHAR buffW[MAX_PATH], *display_name;
+    BSTR display_name = NULL;
     HRESULT hr;
 
     TRACE("(%p,%s,%p)\n", iface, debugstr_variant(&index), item);
@@ -1152,7 +1152,7 @@ static HRESULT WINAPI FolderItemsImpl_Item(FolderItems3 *iface, VARIANT index, F
             if (V_I4(&index) >= This->item_count || V_I4(&index) < 0)
                 return S_FALSE;
 
-            display_name = This->item_names[V_I4(&index)];
+            display_name = SysAllocString(This->item_names[V_I4(&index)]);
             break;
 
         case VT_BSTR:
@@ -1167,15 +1167,13 @@ static HRESULT WINAPI FolderItemsImpl_Item(FolderItems3 *iface, VARIANT index, F
                     NULL, &pidl, NULL)))
                 return S_FALSE;
 
-            IShellFolder2_GetDisplayNameOf(This->folder->folder, pidl, SHGDN_FORPARSING, &strret);
-            StrRetToBufW(&strret, NULL, buffW, sizeof(buffW)/sizeof(*buffW));
+            if (IShellFolder2_GetDisplayNameOf(This->folder->folder, pidl, SHGDN_FORPARSING, &strret) == S_OK)
+                StrRetToBSTR(&strret, pidl, &display_name);
             ILFree(pidl);
-
-            display_name = buffW;
             break;
         }
         case VT_ERROR:
-            return FolderItem_Constructor(This->folder, NULL, item);
+            break;
 
         default:
             FIXME("Index type %d not handled.\n", V_VT(&index));
@@ -1184,7 +1182,9 @@ static HRESULT WINAPI FolderItemsImpl_Item(FolderItems3 *iface, VARIANT index, F
             return E_NOTIMPL;
     }
 
-    return FolderItem_Constructor(This->folder, display_name, item);
+    hr = FolderItem_Constructor(This->folder, display_name, item);
+    SysFreeString(display_name);
+    return hr;
 }
 
 static HRESULT WINAPI FolderItemsImpl__NewEnum(FolderItems3 *iface, IUnknown **ppunk)
@@ -1313,7 +1313,7 @@ static HRESULT FolderItems_Constructor(FolderImpl *folder, FolderItems **ret)
         ULONG fetched;
 
         pidls = HeapAlloc(GetProcessHeap(), 0, This->item_count * sizeof(*pidls));
-        This->item_names = HeapAlloc(GetProcessHeap(), 0, This->item_count * sizeof(*This->item_names));
+        This->item_names = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->item_count * sizeof(*This->item_names));
 
         if (!pidls || !This->item_names)
         {
@@ -1329,13 +1329,10 @@ static HRESULT FolderItems_Constructor(FolderImpl *folder, FolderItems **ret)
 
         for (i = 0; i < This->item_count; i++)
         {
-            WCHAR buffW[MAX_PATH];
             STRRET strret;
 
-            IShellFolder2_GetDisplayNameOf(folder->folder, pidls[i], SHGDN_FORPARSING, &strret);
-            StrRetToBufW(&strret, NULL, buffW, sizeof(buffW)/sizeof(*buffW));
-
-            This->item_names[i] = strdupW(buffW);
+            if (IShellFolder2_GetDisplayNameOf(folder->folder, pidls[i], SHGDN_FORPARSING, &strret) == S_OK)
+                StrRetToBSTR(&strret, pidls[i], &This->item_names[i]);
 
             ILFree(pidls[i]);
         }
@@ -1397,6 +1394,7 @@ static ULONG WINAPI FolderImpl_Release(Folder3 *iface)
     if (!ref)
     {
         ILFree(This->pidl);
+        SysFreeString(This->path);
         IShellFolder2_Release(This->folder);
         IDispatch_Release(This->application);
         HeapFree(GetProcessHeap(), 0, This);
@@ -1463,7 +1461,6 @@ static HRESULT WINAPI FolderImpl_get_Title(Folder3 *iface, BSTR *title)
     FolderImpl *This = impl_from_Folder(iface);
     PCUITEMID_CHILD last_part;
     IShellFolder2 *parent;
-    WCHAR buffW[MAX_PATH];
     SHELLDETAILS sd;
     HRESULT hr;
 
@@ -1479,10 +1476,7 @@ static HRESULT WINAPI FolderImpl_get_Title(Folder3 *iface, BSTR *title)
     if (FAILED(hr))
         return hr;
 
-    StrRetToBufW(&sd.str, NULL, buffW, sizeof(buffW)/sizeof(buffW[0]));
-    *title = SysAllocString(buffW);
-
-    return *title ? S_OK : E_OUTOFMEMORY;
+    return StrRetToBSTR(&sd.str, last_part, title);
 }
 
 static HRESULT WINAPI FolderImpl_get_Application(Folder3 *iface, IDispatch **disp)
@@ -1529,10 +1523,10 @@ static HRESULT WINAPI FolderImpl_Items(Folder3 *iface, FolderItems **ppid)
 static HRESULT WINAPI FolderImpl_ParseName(Folder3 *iface, BSTR name, FolderItem **item)
 {
     FolderImpl *This = impl_from_Folder(iface);
-    WCHAR pathW[MAX_PATH];
     LPITEMIDLIST pidl;
     STRRET strret;
     HRESULT hr;
+    BSTR path;
 
     TRACE("(%p,%s,%p)\n", iface, debugstr_w(name), item);
 
@@ -1541,14 +1535,16 @@ static HRESULT WINAPI FolderImpl_ParseName(Folder3 *iface, BSTR name, FolderItem
     if (FAILED(IShellFolder2_ParseDisplayName(This->folder, NULL, NULL, name, NULL, &pidl, NULL)))
         return S_FALSE;
 
-    hr = IShellFolder2_GetDisplayNameOf(This->folder, pidl, SHGDN_FORPARSING, &strret);
+    if ((hr = IShellFolder2_GetDisplayNameOf(This->folder, pidl, SHGDN_FORPARSING, &strret)) == S_OK)
+        StrRetToBSTR(&strret, pidl, &path);
+
     ILFree(pidl);
     if (FAILED(hr))
         return S_FALSE;
 
-    StrRetToBufW(&strret, NULL, pathW, sizeof(pathW)/sizeof(*pathW));
-
-    return FolderItem_Constructor(This, pathW, item);
+    hr = FolderItem_Constructor(This, path, item);
+    SysFreeString(path);
+    return hr;
 }
 
 static HRESULT WINAPI FolderImpl_NewFolder(Folder3 *iface, BSTR bName,
@@ -1686,7 +1682,7 @@ static HRESULT Folder_Constructor(IShellFolder2 *folder, LPITEMIDLIST pidl, Fold
 
     hr = SHBindToParent(pidl, &IID_IShellFolder2, (void **)&parent, &last_part);
     IShellFolder2_GetDisplayNameOf(parent, last_part, SHGDN_FORPARSING, &strret);
-    StrRetToBufW(&strret, NULL, This->path, sizeof(This->path)/sizeof(*This->path));
+    StrRetToBSTR(&strret, last_part, &This->path);
     IShellFolder2_Release(parent);
 
     IShellDispatch_Constructor(NULL, &IID_IDispatch, (void **)&This->application);




More information about the wine-cvs mailing list