From: Gabriel Ivăncescu gabrielopcode@gmail.com
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 54828f99acc..836a7a5d1d0 100644 --- a/dlls/shell32/shfldr_fs.c +++ b/dlls/shell32/shfldr_fs.c @@ -1852,7 +1852,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; @@ -1875,6 +1875,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); @@ -1885,25 +1895,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 ); }