From ecb5cae48f5289efc77a933b059831a51798d9ba Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Sat, 8 Jun 2024 18:45:23 +0200 Subject: [PATCH] [SHELL32] SetNameOf should not append old extension to folders (#6954) --- dll/shellext/netshell/shfldr_netconnect.cpp | 9 +++-- dll/win32/shell32/folders/CFSFolder.cpp | 38 +++++++++------------ dll/win32/shell32/folders/CRegFolder.cpp | 3 +- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/dll/shellext/netshell/shfldr_netconnect.cpp b/dll/shellext/netshell/shfldr_netconnect.cpp index 7c90907f7ac..588f2c063e8 100644 --- a/dll/shellext/netshell/shfldr_netconnect.cpp +++ b/dll/shellext/netshell/shfldr_netconnect.cpp @@ -270,9 +270,12 @@ HRESULT WINAPI CNetworkConnections::SetNameOf ( if (FAILED_UNEXPECTEDLY(hr)) return hr; - *pPidlOut = ILCreateNetConnectItem(pCon); - if (*pPidlOut == NULL) - return E_FAIL; + if (pPidlOut) + { + *pPidlOut = ILCreateNetConnectItem(pCon); + if (*pPidlOut == NULL) + return E_FAIL; + } return S_OK; } diff --git a/dll/win32/shell32/folders/CFSFolder.cpp b/dll/win32/shell32/folders/CFSFolder.cpp index 95a5030a2d3..50340a39db7 100644 --- a/dll/win32/shell32/folders/CFSFolder.cpp +++ b/dll/win32/shell32/folders/CFSFolder.cpp @@ -1499,7 +1499,7 @@ HRESULT WINAPI CFSFolder::SetNameOf( } /* build source path */ - PathCombineW(szSrc, m_sPathTarget, pDataW->wszName); + PathCombineW(szSrc, m_sPathTarget, pDataW->wszName); // FIXME: PIDLs without wide string /* build destination path */ if (dwFlags == SHGDN_NORMAL || dwFlags & SHGDN_INFOLDER) @@ -1507,39 +1507,33 @@ HRESULT WINAPI CFSFolder::SetNameOf( else lstrcpynW(szDest, lpName, MAX_PATH); - if(!(dwFlags & SHGDN_FORPARSING) && SHELL_FS_HideExtension(szSrc)) { - WCHAR *ext = PathFindExtensionW(szSrc); - if(*ext != '\0') { - INT len = wcslen(szDest); - lstrcpynW(szDest + len, ext, MAX_PATH - len); - } + if (!(dwFlags & SHGDN_FORPARSING) && !bIsFolder && SHELL_FS_HideExtension(szSrc)) + { + LPCWSTR ext = PathFindExtensionW(szSrc); + if (*ext) + PathAddExtensionW(szDest, ext); } + HRESULT hr = S_OK; TRACE ("src=%s dest=%s\n", debugstr_w(szSrc), debugstr_w(szDest)); if (!wcscmp(szSrc, szDest)) { /* src and destination is the same */ - HRESULT hr = S_OK; if (pPidlOut) - hr = _ILCreateFromPathW(szDest, pPidlOut); - - return hr; + hr = SHILClone(pidl, pPidlOut); } - - if (MoveFileW (szSrc, szDest)) + else if (MoveFileW(szSrc, szDest)) { - HRESULT hr = S_OK; - if (pPidlOut) - hr = _ILCreateFromPathW(szDest, pPidlOut); + hr = ParseDisplayName(hwndOwner, NULL, PathFindFileNameW(szDest), NULL, pPidlOut, NULL); - SHChangeNotify (bIsFolder ? SHCNE_RENAMEFOLDER : SHCNE_RENAMEITEM, - SHCNF_PATHW, szSrc, szDest); - - return hr; + SHChangeNotify(bIsFolder ? SHCNE_RENAMEFOLDER : SHCNE_RENAMEITEM, SHCNF_PATHW, szSrc, szDest); } - - return E_FAIL; + else + { + hr = HResultFromWin32(GetLastError()); + } + return hr; } HRESULT WINAPI CFSFolder::GetDefaultSearchGUID(GUID * pguid) diff --git a/dll/win32/shell32/folders/CRegFolder.cpp b/dll/win32/shell32/folders/CRegFolder.cpp index c178a3d3578..defea6ed4ce 100644 --- a/dll/win32/shell32/folders/CRegFolder.cpp +++ b/dll/win32/shell32/folders/CRegFolder.cpp @@ -772,8 +772,7 @@ HRESULT WINAPI CRegFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* if (res == ERROR_SUCCESS) { - *pPidlOut = ILClone(pidl); - return S_OK; + return pPidlOut ? SHILClone(pidl, pPidlOut) : S_OK; } return E_FAIL;