Fix incorrectly finding 'executable' directories instead of files.
authorManuel Klimek <klimek@google.com>
Mon, 17 Jun 2013 10:48:34 +0000 (10:48 +0000)
committerManuel Klimek <klimek@google.com>
Mon, 17 Jun 2013 10:48:34 +0000 (10:48 +0000)
This broke for example the 'not' utility, if a directory called
'FileCheck' is executable and in the path before the actual 'FileCheck'.

This patch steals the implementation of the "old" PathV1 canExecute
implementation:
- checks for R_OK (file readable): this is necessary for executing
  scripts; we should not regress here unless we have good reasons
- checks for S_ISREG; if we want to get rid of this, we'd need to
  change all callers who already made the assumption when depending
  on Path V1.

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

lib/Support/Unix/PathV2.inc

index df8841220b57799256a35ee053b3f67a97ed992c..68c17d534cdd7aae7fb46272f35efa28d9a2d0fe 100644 (file)
@@ -296,7 +296,14 @@ bool can_execute(const Twine &Path) {
   SmallString<128> PathStorage;
   StringRef P = Path.toNullTerminatedStringRef(PathStorage);
 
-  return ::access(P.begin(), X_OK) != -1;
+  if (0 != access(P.begin(), R_OK | X_OK))
+    return false;
+  struct stat buf;
+  if (0 != stat(P.begin(), &buf))
+    return false;
+  if (!S_ISREG(buf.st_mode))
+    return false;
+  return true;
 }
 
 bool equivalent(file_status A, file_status B) {