https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ea936478f53f370957972…
commit ea936478f53f3709579726b7112d486458a1734e
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Fri Aug 2 04:16:02 2024 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Fri Aug 2 04:16:02 2024 +0900
[BROWSEUI][SHELL32] Fix shell path parsing (#7202)
Fix shell path parsing.
JIRA issue: CORE-19693
JIRA issue: CORE-19694
- Fix CACListISF class by using
PIDL attributes.
- Use min macro instead of max
macro in Shell_ParseSpecialFolder
function.
---
dll/win32/browseui/aclistisf.cpp | 20 +++++++++++++++-----
dll/win32/shell32/wine/shellpath.c | 2 +-
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dll/win32/browseui/aclistisf.cpp b/dll/win32/browseui/aclistisf.cpp
index 458ab046b5b..392f6510fea 100644
--- a/dll/win32/browseui/aclistisf.cpp
+++ b/dll/win32/browseui/aclistisf.cpp
@@ -246,9 +246,15 @@ STDMETHODIMP CACListISF::Next(ULONG celt, LPOLESTR *rgelt, ULONG
*pceltFetched)
if (!pszRawPath || !pszExpanded)
continue;
- if ((m_dwOptions & ACLO_FILESYSDIRS) &&
!PathIsDirectoryW(pszExpanded))
+ DWORD attrs = SFGAO_FOLDER | SFGAO_FILESYSTEM;
+ LPCITEMIDLIST pidlRef = pidlChild;
+ hr = m_pShellFolder->GetAttributesOf(1, &pidlRef, &attrs);
+ if (FAILED_UNEXPECTEDLY(hr))
continue;
- else if ((m_dwOptions & ACLO_FILESYSONLY) &&
!PathFileExistsW(pszExpanded))
+
+ if ((m_dwOptions & ACLO_FILESYSDIRS) && !(attrs &
SFGAO_FOLDER))
+ continue;
+ if ((m_dwOptions & (ACLO_FILESYSONLY | ACLO_FILESYSDIRS)) &&
!(attrs & SFGAO_FILESYSTEM))
continue;
hr = S_OK;
@@ -339,12 +345,16 @@ STDMETHODIMP CACListISF::Expand(LPCOLESTR pszExpand)
{
if (PathIsRelativeW(pszExpand) &&
SHGetPathFromIDListW(m_pidlCurDir, szPath1) &&
- PathCombineW(szPath2, szPath1, pszExpand))
+ PathCombineW(szPath2, szPath1, pszExpand) &&
+ PathFileExistsW(szPath2))
{
pszExpand = szPath2;
}
- GetFullPathNameW(pszExpand, _countof(szPath1), szPath1, NULL);
- pszExpand = szPath1;
+ else if (PathFileExistsW(pszExpand))
+ {
+ GetFullPathNameW(pszExpand, _countof(szPath1), szPath1, NULL);
+ pszExpand = szPath1;
+ }
}
CComHeapPtr<ITEMIDLIST> pidl;
diff --git a/dll/win32/shell32/wine/shellpath.c b/dll/win32/shell32/wine/shellpath.c
index cd05e1ed010..6537e052a0d 100644
--- a/dll/win32/shell32/wine/shellpath.c
+++ b/dll/win32/shell32/wine/shellpath.c
@@ -1866,7 +1866,7 @@ INT Shell_ParseSpecialFolder(_In_ LPCWSTR pszStart, _Out_ LPWSTR
*ppch, _Out_ IN
{
*ppch = (LPWSTR)(pchBackslash + 1);
*pcch = (pchBackslash - pszStart) + 1;
- StrCpyNW(szPath, pszStart, max(*pcch, _countof(szPath)));
+ StrCpyNW(szPath, pszStart, min(*pcch, _countof(szPath)));
pszPath = szPath;
}
else