From 07d55ce1cfd51cc854d9258e79b52297d8538286 Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Thu, 2 May 2024 18:00:12 +0200 Subject: [PATCH] [SHELL32] CFSFolder parsing must only apply bind data to the last item (#6794) When IShellFolder::ParseDisplayName is asked to parse multiple path elements, the IFileSystemBindData (if any) only applies to the last item. The other elements are always folders. --- dll/win32/shell32/folders/CFSFolder.cpp | 9 +++++---- dll/win32/shell32/folders/CFSFolder.h | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dll/win32/shell32/folders/CFSFolder.cpp b/dll/win32/shell32/folders/CFSFolder.cpp index 2ec03d18298..7c2b11160dc 100644 --- a/dll/win32/shell32/folders/CFSFolder.cpp +++ b/dll/win32/shell32/folders/CFSFolder.cpp @@ -685,7 +685,7 @@ HRESULT SHELL32_GetFSItemAttributes(IShellFolder * psf, LPCITEMIDLIST pidl, LPDW HRESULT CFSFolder::_ParseSimple( _In_ LPOLESTR lpszDisplayName, - _Out_ WIN32_FIND_DATAW *pFind, + _Inout_ WIN32_FIND_DATAW *pFind, _Out_ LPITEMIDLIST *ppidl) { HRESULT hr; @@ -693,6 +693,8 @@ HRESULT CFSFolder::_ParseSimple( *ppidl = NULL; + const DWORD finalattr = pFind->dwFileAttributes; + const DWORD finalsizelo = pFind->nFileSizeLow; LPITEMIDLIST pidl; for (hr = S_OK; SUCCEEDED(hr); hr = SHILAppend(pidl, ppidl)) { @@ -700,9 +702,8 @@ HRESULT CFSFolder::_ParseSimple( if (hr != S_OK) break; - if (pchNext) - pFind->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; - + pFind->dwFileAttributes = pchNext ? FILE_ATTRIBUTE_DIRECTORY : finalattr; + pFind->nFileSizeLow = pchNext ? 0 : finalsizelo; pidl = _ILCreateFromFindDataW(pFind); if (!pidl) { diff --git a/dll/win32/shell32/folders/CFSFolder.h b/dll/win32/shell32/folders/CFSFolder.h index d74c7d915a2..e3db017578d 100644 --- a/dll/win32/shell32/folders/CFSFolder.h +++ b/dll/win32/shell32/folders/CFSFolder.h @@ -36,7 +36,7 @@ class CFSFolder : HRESULT _ParseSimple( _In_ LPOLESTR lpszDisplayName, - _Out_ WIN32_FIND_DATAW *pFind, + _Inout_ WIN32_FIND_DATAW *pFind, _Out_ LPITEMIDLIST *ppidl); BOOL _GetFindDataFromName(_In_ LPCWSTR pszName, _Out_ WIN32_FIND_DATAW *pFind); HRESULT _CreateIDListFromName(LPCWSTR pszName, DWORD attrs, IBindCtx *pbc, LPITEMIDLIST *ppidl);