shell32: Validate the destination name in IShellFolder::SetNameOf.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0ecd807ea6
commit
1dcd1fe613
|
@ -883,6 +883,7 @@ static HRESULT WINAPI IShellFolder_fnSetNameOf (IShellFolder2 * iface,
|
||||||
DWORD dwFlags,
|
DWORD dwFlags,
|
||||||
LPITEMIDLIST * pPidlOut)
|
LPITEMIDLIST * pPidlOut)
|
||||||
{
|
{
|
||||||
|
static const WCHAR invalid_chars[] = { '\\','/',':','*','?','"','<','>','|',0 };
|
||||||
IGenericSFImpl *This = impl_from_IShellFolder2(iface);
|
IGenericSFImpl *This = impl_from_IShellFolder2(iface);
|
||||||
WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1];
|
WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1];
|
||||||
LPWSTR ptr;
|
LPWSTR ptr;
|
||||||
|
@ -891,20 +892,20 @@ static HRESULT WINAPI IShellFolder_fnSetNameOf (IShellFolder2 * iface,
|
||||||
TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This, hwndOwner, pidl,
|
TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This, hwndOwner, pidl,
|
||||||
debugstr_w (lpName), dwFlags, pPidlOut);
|
debugstr_w (lpName), dwFlags, pPidlOut);
|
||||||
|
|
||||||
|
/* pidl has to contain a single non-empty SHITEMID */
|
||||||
|
if (_ILIsDesktop(pidl) || !_ILIsPidlSimple(pidl) || !_ILGetTextPointer(pidl)) return E_INVALIDARG;
|
||||||
|
|
||||||
|
if (strpbrkW( lpName, invalid_chars )) return HRESULT_FROM_WIN32(ERROR_CANCELLED);
|
||||||
|
|
||||||
/* build source path */
|
/* build source path */
|
||||||
lstrcpynW(szSrc, This->sPathTarget, MAX_PATH);
|
lstrcpynW(szSrc, This->sPathTarget, MAX_PATH);
|
||||||
ptr = PathAddBackslashW (szSrc);
|
ptr = PathAddBackslashW (szSrc);
|
||||||
if (ptr)
|
_ILSimpleGetTextW (pidl, ptr, MAX_PATH + 1 - (ptr - szSrc));
|
||||||
_ILSimpleGetTextW (pidl, ptr, MAX_PATH + 1 - (ptr - szSrc));
|
|
||||||
|
|
||||||
/* build destination path */
|
/* build destination path */
|
||||||
if (dwFlags == SHGDN_NORMAL || dwFlags & SHGDN_INFOLDER) {
|
lstrcpynW(szDest, This->sPathTarget, MAX_PATH);
|
||||||
lstrcpynW(szDest, This->sPathTarget, MAX_PATH);
|
ptr = PathAddBackslashW (szDest);
|
||||||
ptr = PathAddBackslashW (szDest);
|
lstrcpynW(ptr, lpName, MAX_PATH + 1 - (ptr - szDest));
|
||||||
if (ptr)
|
|
||||||
lstrcpynW(ptr, lpName, MAX_PATH + 1 - (ptr - szDest));
|
|
||||||
} else
|
|
||||||
lstrcpynW(szDest, lpName, MAX_PATH);
|
|
||||||
|
|
||||||
if(!(dwFlags & SHGDN_FORPARSING) && SHELL_FS_HideExtension(szSrc)) {
|
if(!(dwFlags & SHGDN_FORPARSING) && SHELL_FS_HideExtension(szSrc)) {
|
||||||
WCHAR *ext = PathFindExtensionW(szSrc);
|
WCHAR *ext = PathFindExtensionW(szSrc);
|
||||||
|
|
Loading…
Reference in New Issue