Make the removal of files use Path::eraseFromDisk just like it does for
authorReid Spencer <rspencer@reidspencer.com>
Mon, 7 Aug 2006 05:34:08 +0000 (05:34 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Mon, 7 Aug 2006 05:34:08 +0000 (05:34 +0000)
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

index 05b9abf8a30ab9811bb83f59c6863b0415bb7457..941e031cc97ef9e0caac93126321a0b2b102461d 100644 (file)
@@ -15,6 +15,7 @@
 #include "Unix.h"
 #include <vector>
 #include <algorithm>
+#include <iostream>
 #if HAVE_EXECINFO_H
 # include <execinfo.h>         // 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<std::string> *FilesToRemove = 0 ;
+std::vector<sys::Path> *FilesToRemove = 0 ;
 std::vector<sys::Path> *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<std::string>;
+    FilesToRemove = new std::vector<sys::Path>;
 
-  FilesToRemove->push_back(Filename.toString());
+  FilesToRemove->push_back(Filename);
 
   std::for_each(IntSigs, IntSigsEnd, RegisterHandler);
   std::for_each(KillSigs, KillSigsEnd, RegisterHandler);