Index: runtime/bin/file_macos.cc |
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc |
index 9b7093daff51e3fe6336ad217173c90e1ee9c5e3..73f86a2e24e7f0282cd55123d651798ce49d5263 100644 |
--- a/runtime/bin/file_macos.cc |
+++ b/runtime/bin/file_macos.cc |
@@ -106,6 +106,14 @@ off_t File::Length() { |
File* File::Open(const char* name, FileOpenMode mode) { |
+ // Report errors for non-regular files. |
+ struct stat st; |
+ if (TEMP_FAILURE_RETRY(stat(name, &st)) == 0) { |
+ if (!S_ISREG(st.st_mode)) { |
+ errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT; |
+ return NULL |
+ } |
+ } |
int flags = O_RDONLY; |
if ((mode & kWrite) != 0) { |
flags = (O_RDWR | O_CREAT); |
@@ -185,6 +193,16 @@ char* File::GetCanonicalPath(const char* pathname) { |
char* File::GetContainingDirectory(char* pathname) { |
+ // Report errors for non-regular files. |
+ struct stat st; |
+ if (TEMP_FAILURE_RETRY(stat(pathname, &st)) == 0) { |
+ if (!S_ISREG(st.st_mode)) { |
+ errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT; |
+ return NULL; |
+ } |
+ } else { |
+ return NULL; |
+ } |
char* path = NULL; |
do { |
path = dirname(pathname); |