Module: wine Branch: master Commit: a9b3fdd3aebe0ef2f7f7905864e7c4fe01f5c4fd URL: https://gitlab.winehq.org/wine/wine/-/commit/a9b3fdd3aebe0ef2f7f7905864e7c4f...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Mon Mar 4 21:52:06 2024 +0200
shell32: Construct the proper path target for UnixFolder.
Worse than just no unix integration is that it can actually crash if you parse e.g. "/".
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/shell32/shfldr_fs.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/shell32/shfldr_fs.c b/dlls/shell32/shfldr_fs.c index 808b20c9cae..928cadfc77c 100644 --- a/dlls/shell32/shfldr_fs.c +++ b/dlls/shell32/shfldr_fs.c @@ -1797,7 +1797,7 @@ static const IDropTargetVtbl dtvt = { ISFDropTarget_Drop };
-static HRESULT create_fs( IUnknown *outer_unk, REFIID riid, void **ppv, const CLSID *clsid) +static HRESULT create_fs( IUnknown *outer_unk, REFIID riid, void **ppv, const CLSID *clsid, const WCHAR *path_target) { IGenericSFImpl *sf; HRESULT hr; @@ -1820,6 +1820,16 @@ static HRESULT create_fs( IUnknown *outer_unk, REFIID riid, void **ppv, const CL sf->ISFHelper_iface.lpVtbl = &shvt; sf->pclsid = clsid; sf->outer_unk = outer_unk ? outer_unk : &sf->IUnknown_inner; + if (path_target) + { + SIZE_T size = (wcslen(path_target) + 1) * sizeof(WCHAR); + if (!(sf->sPathTarget = SHAlloc(size))) + { + LocalFree(sf); + return E_OUTOFMEMORY; + } + memcpy(sf->sPathTarget, path_target, size); + }
hr = IUnknown_QueryInterface(&sf->IUnknown_inner, riid, ppv); IUnknown_Release(&sf->IUnknown_inner); @@ -1830,25 +1840,25 @@ static HRESULT create_fs( IUnknown *outer_unk, REFIID riid, void **ppv, const CL
HRESULT WINAPI IFSFolder_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv) { - return create_fs( outer_unk, riid, ppv, &CLSID_ShellFSFolder ); + return create_fs( outer_unk, riid, ppv, &CLSID_ShellFSFolder, NULL ); }
HRESULT WINAPI UnixFolder_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv) { - return create_fs( outer_unk, riid, ppv, &CLSID_UnixFolder ); + return create_fs( outer_unk, riid, ppv, &CLSID_UnixFolder, L"\\?\unix\" ); }
HRESULT WINAPI UnixDosFolder_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv) { - return create_fs( outer_unk, riid, ppv, &CLSID_UnixDosFolder ); + return create_fs( outer_unk, riid, ppv, &CLSID_UnixDosFolder, NULL ); }
HRESULT WINAPI FolderShortcut_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv) { - return create_fs( outer_unk, riid, ppv, &CLSID_FolderShortcut ); + return create_fs( outer_unk, riid, ppv, &CLSID_FolderShortcut, NULL ); }
HRESULT WINAPI MyDocuments_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv) { - return create_fs( outer_unk, riid, ppv, &CLSID_MyDocuments ); + return create_fs( outer_unk, riid, ppv, &CLSID_MyDocuments, NULL ); }