Only delete regular files and directories.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 17 Jun 2013 20:35:51 +0000 (20:35 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 17 Jun 2013 20:35:51 +0000 (20:35 +0000)
This ports a missing feature from PathV1.h. I am not sure how to test this
with the regular infrastructure, but an Apple bot should check this when
r183985 is reapplied.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184119 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/Unix/PathV2.inc

index 68c17d534cdd7aae7fb46272f35efa28d9a2d0fe..c98c21d07cce7fa9658a3cea1c75bb497e570191 100644 (file)
@@ -236,6 +236,22 @@ error_code remove(const Twine &path, bool &existed) {
   SmallString<128> path_storage;
   StringRef p = path.toNullTerminatedStringRef(path_storage);
 
+  struct stat buf;
+  if (stat(p.begin(), &buf) != 0) {
+    if (errno != errc::no_such_file_or_directory)
+      return error_code(errno, system_category());
+    existed = false;
+    return error_code::success();
+  }
+
+  // Note: this check catches strange situations. In all cases, LLVM should
+  // only be involved in the creation and deletion of regular files.  This
+  // check ensures that what we're trying to erase is a regular file. It
+  // effectively prevents LLVM from erasing things like /dev/null, any block
+  // special file, or other things that aren't "regular" files.
+  if (!S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode))
+    return make_error_code(errc::operation_not_permitted);
+
   if (::remove(p.begin()) == -1) {
     if (errno != errc::no_such_file_or_directory)
       return error_code(errno, system_category());