[llvm-branch-commits] [llvm] 6ec777c - [Support] PR42623: Avoid setting the delete-on-close bit if a TempFile doesn't reside on a local drive

Tom Stellard via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Dec 15 15:24:09 PST 2020


Author: Ronald Wampler
Date: 2020-12-15T18:23:10-05:00
New Revision: 6ec777c2f6496b4fe1d78cc6d6871a3dc931a185

URL: https://github.com/llvm/llvm-project/commit/6ec777c2f6496b4fe1d78cc6d6871a3dc931a185
DIFF: https://github.com/llvm/llvm-project/commit/6ec777c2f6496b4fe1d78cc6d6871a3dc931a185.diff

LOG: [Support] PR42623: Avoid setting the delete-on-close bit if a TempFile doesn't reside on a local drive

On Windows, after commit 881ba104656c40098d4bc90c52613c08136f0fe1, tools
using TempFile would error with "bad file descriptor" when writing the
file on a network drive. It appears that setting the delete-on-close bit via
SetFileInformationByHandle/FileDispositionInfo prevented it from
accessing the file on network drives, and although using
FILE_DISPOSITION_INFO seems to work, it causes other troubles.

Differential Revision: https://reviews.llvm.org/D81803

(cherry picked from commit 79657e2339b58bc01fe1b85a448bb073d57d90bb)

Added: 
    

Modified: 
    llvm/lib/Support/Windows/Path.inc

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc
index 365ab01c0a16..a4ffc0ec4313 100644
--- a/llvm/lib/Support/Windows/Path.inc
+++ b/llvm/lib/Support/Windows/Path.inc
@@ -402,6 +402,20 @@ std::error_code is_local(int FD, bool &Result) {
 }
 
 static std::error_code setDeleteDisposition(HANDLE Handle, bool Delete) {
+  // First, check if the file is on a network (non-local) drive. If so, don't
+  // set DeleteFile to true, since it prevents opening the file for writes.
+  SmallVector<wchar_t, 128> FinalPath;
+  if (std::error_code EC = realPathFromHandle(Handle, FinalPath))
+    return EC;
+
+  bool IsLocal;
+  if (std::error_code EC = is_local_internal(FinalPath, IsLocal))
+    return EC;
+
+  if (!IsLocal)
+    return std::error_code();
+
+  // The file is on a local drive, set the DeleteFile to true.
   FILE_DISPOSITION_INFO Disposition;
   Disposition.DeleteFile = Delete;
   if (!SetFileInformationByHandle(Handle, FileDispositionInfo, &Disposition,


        


More information about the llvm-branch-commits mailing list