From 4f2676bee4f0f02a82c4a3fc28a59d6a2aa928e1 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Thu, 6 Jul 2017 19:38:12 +0000 Subject: [PATCH] Backport r307092 --- 0001-ELF-Only-unlink-regular-files.patch | 48 ++++++++++++++++++++++++ lld.spec | 7 +++- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 0001-ELF-Only-unlink-regular-files.patch diff --git a/0001-ELF-Only-unlink-regular-files.patch b/0001-ELF-Only-unlink-regular-files.patch new file mode 100644 index 0000000..43b2362 --- /dev/null +++ b/0001-ELF-Only-unlink-regular-files.patch @@ -0,0 +1,48 @@ +From d146e98b7f94940386f60a902031b2a9b6237730 Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Tue, 4 Jul 2017 16:03:34 +0000 +Subject: [PATCH] ELF: Only unlink regular files + +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 +--- + ELF/Writer.cpp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/ELF/Writer.cpp b/ELF/Writer.cpp +index b004a4f..d52165b 100644 +--- a/ELF/Writer.cpp ++++ b/ELF/Writer.cpp +@@ -1650,7 +1650,8 @@ template void Writer::writeHeader() { + // This function spawns a background thread to call unlink. + // The calling thread returns almost immediately. + static void 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 +-- +1.8.3.1 + diff --git a/lld.spec b/lld.spec index a99b153..879fe69 100644 --- a/lld.spec +++ b/lld.spec @@ -1,12 +1,14 @@ Name: lld Version: 4.0.1 -Release: 1%{?dist} +Release: 2%{?dist} Summary: The LLVM Linker License: NCSA URL: http://llvm.org Source0: http://llvm.org/releases/%{version}/lld-%{version}.src.tar.xz +Patch0: 0001-ELF-Only-unlink-regular-files.patch + BuildRequires: cmake BuildRequires: llvm-devel = %{version} BuildRequires: ncurses-devel @@ -76,6 +78,9 @@ chrpath --delete %{buildroot}%{_libdir}/*.so* %{_libdir}/liblld*.so.* %changelog +* Thu Jul 06 2017 Tom Stellard - 4.0.1-2 +- Backport r307092 + * Tue Jul 04 2017 Tom Stellard - 4.0.1-1 - 4.0.1 Release