Skip to content

Commit

Permalink
[Support] PR42623: Avoid setting the delete-on-close bit if a TempFil…
Browse files Browse the repository at this point in the history
…e doesn't reside on a local drive

On Windows, after commit 881ba10, 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
  • Loading branch information
rdwampler committed Oct 30, 2020
1 parent 84e8257 commit 79657e2
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions llvm/lib/Support/Windows/Path.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 79657e2

Please sign in to comment.