[llvm] [Windows] Avoid crash calling remove_directories() (PR #118677)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 4 10:10:27 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-support
@llvm/pr-subscribers-platform-windows
Author: Dmitry Vasilyev (slydiman)
<details>
<summary>Changes</summary>
We faced an unexpected crash in SHELL32_CallFileCopyHooks() on the buildbot [lldb-remote-linux-win](https://lab.llvm.org/staging/#/builders/197/builds/1066). The host is Windows Server 2022 w/o any 3rd party shell extensions. See #<!-- -->118032 for more details.
Based on [this article](https://devblogs.microsoft.com/oldnewthing/20120330-00/?p=7963).
---
Full diff: https://github.com/llvm/llvm-project/pull/118677.diff
1 Files Affected:
- (modified) llvm/lib/Support/Windows/Path.inc (+24-5)
``````````diff
diff --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc
index c4bd5e24723517..ecea1efefe0098 100644
--- a/llvm/lib/Support/Windows/Path.inc
+++ b/llvm/lib/Support/Windows/Path.inc
@@ -1387,12 +1387,31 @@ std::error_code remove_directories(const Twine &path, bool IgnoreErrors) {
Path16.push_back(0);
Path16.push_back(0);
- SHFILEOPSTRUCTW shfos = {};
- shfos.wFunc = FO_DELETE;
- shfos.pFrom = Path16.data();
- shfos.fFlags = FOF_NO_UI;
+ HRESULT HR = CoInitializeEx(NULL, COINIT_MULTITHREADED);
+ if (SUCCEEDED(HR)) {
+ IFileOperation *FileOp;
+ HR = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL,
+ IID_PPV_ARGS(&FileOp));
+ if (SUCCEEDED(HR)) {
+ HR = FileOp->SetOperationFlags(FOF_NO_UI | FOFX_NOCOPYHOOKS);
+ if (SUCCEEDED(HR)) {
+ IShellItem *ShItem = NULL;
+ HR = SHCreateItemFromParsingName(Path16.data(), NULL,
+ IID_PPV_ARGS(&ShItem));
+ if (SUCCEEDED(HR)) {
+ HR = FileOp->DeleteItem(ShItem, NULL);
+ ShItem->Release();
+ }
+ if (SUCCEEDED(HR)) {
+ HR = FileOp->PerformOperations();
+ }
+ }
+ FileOp->Release();
+ }
+ }
+ CoUninitialize();
- int result = ::SHFileOperationW(&shfos);
+ int result = FAILED(HR) ? HRESULT_CODE(HR) : 0;
if (result != 0 && !IgnoreErrors)
return mapWindowsError(result);
return std::error_code();
``````````
</details>
https://github.com/llvm/llvm-project/pull/118677
More information about the llvm-commits
mailing list