Skip to content

Commit

Permalink
ELF: Only unlink regular files
Browse files Browse the repository at this point in the history
Summary:
If the output file is a character file (e.g. /dev/null) unlinking it could
potentially destabilize the user's system.  For example,
unlinking causes `lld %input -o /dev/null` to replace /dev/null with a
regular file, which will lead to unexpected behavior in other programs
that read from /dev/null, and worse than expected peformance for
programs that write to /dev/null.

This makes it possible to run the test-release.sh script as root.
Prior to this patch, the ELF/basic.s test would replace
/dev/null with a regular file, which would cause crashes in llvm
test-suite programs that piped /dev/null to stdin.

For example, if you run the test-relase.sh script as root,

Reviewers: ruiu

Reviewed By: ruiu

Subscribers: emaste, llvm-commits

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

llvm-svn: 307092
  • Loading branch information
tstellar committed Jul 4, 2017
1 parent de5d250 commit c17a04c
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lld/ELF/Filesystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ using namespace lld::elf;
// This function spawns a background thread to call unlink.
// The calling thread returns almost immediately.
void elf::unlinkAsync(StringRef Path) {
if (!Config->Threads || !sys::fs::exists(Config->OutputFile))
if (!Config->Threads || !sys::fs::exists(Config->OutputFile) ||
!sys::fs::is_regular_file(Config->OutputFile))
return;

// First, rename Path to avoid race condition. We cannot remove
Expand Down

0 comments on commit c17a04c

Please sign in to comment.