From a8e80c51882c008e1e29194ea9c808ede1164eff Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Mon, 7 Aug 2006 05:34:08 +0000 Subject: Make the removal of files use Path::eraseFromDisk just like it does for the removal of directories. Using std::remove is indiscriminate and can lead to the removal of things like /dev/null if run as root. The Path::eraseFromDisk method ensures that we only ever remove regular files or directories, but never character or block special nodes. This should clear up the problem with usage like: llvm-as -o /dev/null which is used in the llvm-test makefiles. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29540 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/System/Unix/Signals.inc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'lib/System/Unix') diff --git a/lib/System/Unix/Signals.inc b/lib/System/Unix/Signals.inc index 05b9abf..941e031 100644 --- a/lib/System/Unix/Signals.inc +++ b/lib/System/Unix/Signals.inc @@ -15,6 +15,7 @@ #include "Unix.h" #include #include +#include #if HAVE_EXECINFO_H # include // For backtrace(). #endif @@ -30,7 +31,7 @@ bool StackTraceRequested = false; /// InterruptFunction - The function to call if ctrl-c is pressed. void (*InterruptFunction)() = 0; -std::vector *FilesToRemove = 0 ; +std::vector *FilesToRemove = 0 ; std::vector *DirectoriesToRemove = 0; // IntSigs - Signals that may interrupt the program at any time. @@ -112,7 +113,7 @@ void PrintStackTrace() { RETSIGTYPE SignalHandler(int Sig) { if (FilesToRemove != 0) while (!FilesToRemove->empty()) { - std::remove(FilesToRemove->back().c_str()); + FilesToRemove->back().eraseFromDisk(true); FilesToRemove->pop_back(); } @@ -156,9 +157,9 @@ void sys::SetInterruptFunction(void (*IF)()) { // RemoveFileOnSignal - The public API void sys::RemoveFileOnSignal(const sys::Path &Filename) { if (FilesToRemove == 0) - FilesToRemove = new std::vector; + FilesToRemove = new std::vector; - FilesToRemove->push_back(Filename.toString()); + FilesToRemove->push_back(Filename); std::for_each(IntSigs, IntSigsEnd, RegisterHandler); std::for_each(KillSigs, KillSigsEnd, RegisterHandler); -- cgit v1.1