From 6a683dc6d8353a27b5052a6ac8311d093bb3da98 Mon Sep 17 00:00:00 2001 From: Russell Johnson Date: Sun, 24 Jun 2018 11:29:57 -0700 Subject: [PATCH] [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 --- dll/win32/shell32/folders/CRecycleBin.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/dll/win32/shell32/folders/CRecycleBin.cpp b/dll/win32/shell32/folders/CRecycleBin.cpp index fb8c1d8dc18..ad80c9dbc73 100644 --- a/dll/win32/shell32/folders/CRecycleBin.cpp +++ b/dll/win32/shell32/folders/CRecycleBin.cpp @@ -3,6 +3,7 @@ * * Copyright (C) 2006 Mikolaj Zalewski * Copyright (C) 2009 Andrew Hill + * Copyright (C) 2018 Russell Johnson * * This library is free software; you can redistribute it and/or * 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; } +/** + * 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 TRASH_CanTrashFile(LPCWSTR wszPath) { @@ -883,12 +889,12 @@ TRASH_CanTrashFile(LPCWSTR wszPath) return FALSE; } - // Only keep the base path. + // Copy and retrieve the root path from get given string WCHAR wszRootPathName[MAX_PATH]; - strcpyW(wszRootPathName, wszPath); - PathRemoveFileSpecW(wszRootPathName); - PathAddBackslashW(wszRootPathName); + StringCbCopy(wszRootPathName, sizeof(wszRootPathName), wszPath); + PathStripToRootW(wszRootPathName); + // Test to see if the drive is fixed (non removable) if (GetDriveTypeW(wszRootPathName) != DRIVE_FIXED) { /* no bitbucket on removable media */ @@ -897,7 +903,7 @@ TRASH_CanTrashFile(LPCWSTR wszPath) 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; } -- 2.17.1