Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(413)

Unified Diff: runtime/bin/file_fuchsia.cc

Issue 2593913003: Make File.create() fail when a directory exists at the same path (Closed)
Patch Set: Fix test for Windows Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/bin/file_fuchsia.cc
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index ff080439d07aa5cd0e0621da58dfe12955c0c93b..ceea0c3d6f37d10fee47b9b0e689dc27ed182079 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -208,9 +208,10 @@ File* File::OpenStdio(int fd) {
bool File::Exists(const char* name) {
- struct stat st;
- if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
- return S_ISREG(st.st_mode);
+ struct stat64 st;
+ if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
+ // Everything but a directory and a link is a file to Dart.
+ return !S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode);
} else {
return false;
}
@@ -218,11 +219,27 @@ bool File::Exists(const char* name) {
bool File::Create(const char* name) {
- int fd = NO_RETRY_EXPECTED(open(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
+ int fd =
+ NO_RETRY_EXPECTED(open64(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
if (fd < 0) {
return false;
}
- return (close(fd) == 0);
+ // File.create returns a File, so we shouldn't be giving the illusion that the
+ // call has created a file or that a file already exists if there is already
+ // an entity at the same path that is a directory or a link.
+ bool is_file = true;
+ struct stat64 st;
+ if (NO_RETRY_EXPECTED(fstat64(fd, &st)) == 0) {
+ if (S_ISDIR(st.st_mode)) {
+ errno = EISDIR;
+ is_file = false;
+ } else if (S_ISLNK(st.st_mode)) {
+ errno = ENOENT;
+ is_file = false;
+ }
+ }
+ FDUtils::SaveErrorAndClose(fd);
+ return is_file;
}

Powered by Google App Engine
This is Rietveld 408576698