From 87bec915f18d1a68d38c675580aa9c33b596d7cd Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 17 Jun 2013 20:35:51 +0000 Subject: 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 --- lib/Support/Unix/PathV2.inc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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()); -- cgit v1.2.3