summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-06-17 20:35:51 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-06-17 20:35:51 +0000
commit87bec915f18d1a68d38c675580aa9c33b596d7cd (patch)
tree5716934a85218a1fbd834f7a1aca4ed07a22467c
parentf7c9b95f94b18d1c8ae15a59bf28c5c2cafa5ad8 (diff)
downloadllvm-87bec915f18d1a68d38c675580aa9c33b596d7cd.tar.gz
llvm-87bec915f18d1a68d38c675580aa9c33b596d7cd.tar.bz2
llvm-87bec915f18d1a68d38c675580aa9c33b596d7cd.tar.xz
Only delete regular files and directories.
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
-rw-r--r--lib/Support/Unix/PathV2.inc16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/Support/Unix/PathV2.inc b/lib/Support/Unix/PathV2.inc
index 68c17d534c..c98c21d07c 100644
--- a/lib/Support/Unix/PathV2.inc
+++ b/lib/Support/Unix/PathV2.inc
@@ -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());