[SHELL32] Fixed TRASH_CanTrashFile() sending the wrong path string to GetVolumeInformationW() (#635)

Function TRASH_CanTrashFile() would always fail because GetVolumeInformationW() requires only the base root path. The path (stored in buffer wszRootPathName) was not being stripped correctly.

CORE-12340
This commit is contained in:
Russell Johnson 2018-06-24 11:29:57 -07:00 committed by Hermès BÉLUSCA - MAÏTO
parent 1b1e1baa6e
commit 6a683dc6d8

View file

@ -3,6 +3,7 @@
* *
* Copyright (C) 2006 Mikolaj Zalewski * Copyright (C) 2006 Mikolaj Zalewski
* Copyright (C) 2009 Andrew Hill * Copyright (C) 2009 Andrew Hill
* Copyright (C) 2018 Russell Johnson
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -867,6 +868,11 @@ HRESULT WINAPI CRecycleBin::Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pd
return S_OK; return S_OK;
} }
/**
* Tests whether a file can be trashed
* @param wszPath Path to the file to be trash
* @returns TRUE if the file can be trashed, FALSE otherwise
*/
BOOL BOOL
TRASH_CanTrashFile(LPCWSTR wszPath) TRASH_CanTrashFile(LPCWSTR wszPath)
{ {
@ -883,12 +889,12 @@ TRASH_CanTrashFile(LPCWSTR wszPath)
return FALSE; return FALSE;
} }
// Only keep the base path. // Copy and retrieve the root path from get given string
WCHAR wszRootPathName[MAX_PATH]; WCHAR wszRootPathName[MAX_PATH];
strcpyW(wszRootPathName, wszPath); StringCbCopy(wszRootPathName, sizeof(wszRootPathName), wszPath);
PathRemoveFileSpecW(wszRootPathName); PathStripToRootW(wszRootPathName);
PathAddBackslashW(wszRootPathName);
// Test to see if the drive is fixed (non removable)
if (GetDriveTypeW(wszRootPathName) != DRIVE_FIXED) if (GetDriveTypeW(wszRootPathName) != DRIVE_FIXED)
{ {
/* no bitbucket on removable media */ /* no bitbucket on removable media */
@ -897,7 +903,7 @@ TRASH_CanTrashFile(LPCWSTR wszPath)
if (!GetVolumeInformationW(wszRootPathName, NULL, 0, &VolSerialNumber, &MaxComponentLength, &FileSystemFlags, NULL, 0)) if (!GetVolumeInformationW(wszRootPathName, NULL, 0, &VolSerialNumber, &MaxComponentLength, &FileSystemFlags, NULL, 0))
{ {
ERR("GetVolumeInformationW failed with %u\n", GetLastError()); ERR("GetVolumeInformationW failed with %u wszRootPathName=%s\n", GetLastError(), debugstr_w(wszRootPathName));
return FALSE; return FALSE;
} }