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

Unified Diff: runtime/bin/file_linux.cc

Issue 1781883002: Fixes some memory leaks in //runtime/bin (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Fix tests on Windows Created 4 years, 9 months 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
« no previous file with comments | « runtime/bin/file_android.cc ('k') | runtime/bin/file_macos.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/file_linux.cc
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index d289c213bd8467da7730e185c96aa02895f96347..495dacdcef6371f5e3c16941edd68004a5ea0bdf 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -20,7 +20,6 @@
#include "platform/signal_blocker.h"
#include "platform/utils.h"
-
namespace dart {
namespace bin {
@@ -112,7 +111,7 @@ bool File::Flush() {
bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
ASSERT(handle_->fd() >= 0);
- ASSERT(end == -1 || end > start);
+ ASSERT((end == -1) || (end > start));
struct flock fl;
switch (lock) {
case File::kLockUnlock:
@@ -146,7 +145,13 @@ int64_t File::Length() {
}
-File* File::Open(const char* name, FileOpenMode mode) {
+File* File::FileOpenW(const wchar_t* system_name, FileOpenMode mode) {
+ UNREACHABLE();
+ return NULL;
+}
+
+
+File* File::ScopedOpen(const char* name, FileOpenMode mode) {
// Report errors for non-regular files.
struct stat64 st;
if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
@@ -184,8 +189,16 @@ File* File::Open(const char* name, FileOpenMode mode) {
}
+File* File::Open(const char* path, FileOpenMode mode) {
+ // ScopedOpen doesn't actually need a scope.
+ return ScopedOpen(path, mode);
+}
+
+
File* File::OpenStdio(int fd) {
- if (fd < 0 || 2 < fd) return NULL;
+ if ((fd < 0) || (2 < fd)) {
+ return NULL;
+ }
return new File(new FileHandle(fd));
}
@@ -291,7 +304,7 @@ bool File::Copy(const char* old_path, const char* new_path) {
// From sendfile man pages:
// Applications may wish to fall back to read(2)/write(2) in the case
// where sendfile() fails with EINVAL or ENOSYS.
- if (result < 0 && (errno == EINVAL || errno == ENOSYS)) {
+ if ((result < 0) && ((errno == EINVAL) || (errno == ENOSYS))) {
const intptr_t kBufferSize = 8 * KB;
uint8_t buffer[kBufferSize];
while ((result = TEMP_FAILURE_RETRY(
@@ -368,9 +381,11 @@ time_t File::LastModified(const char* name) {
}
-char* File::LinkTarget(const char* pathname) {
+const char* File::LinkTarget(const char* pathname) {
struct stat64 link_stats;
- if (TEMP_FAILURE_RETRY(lstat64(pathname, &link_stats)) != 0) return NULL;
+ if (TEMP_FAILURE_RETRY(lstat64(pathname, &link_stats)) != 0) {
+ return NULL;
+ }
if (!S_ISLNK(link_stats.st_mode)) {
errno = ENOENT;
return NULL;
@@ -385,10 +400,8 @@ char* File::LinkTarget(const char* pathname) {
if (target_size <= 0) {
return NULL;
}
- char* target_name = reinterpret_cast<char*>(malloc(target_size + 1));
- if (target_name == NULL) {
- return NULL;
- }
+ char* target_name = DartUtils::ScopedCString(target_size + 1);
+ ASSERT(target_name != NULL);
memmove(target_name, target, target_size);
target_name[target_size] = '\0';
return target_name;
@@ -400,13 +413,16 @@ bool File::IsAbsolutePath(const char* pathname) {
}
-char* File::GetCanonicalPath(const char* pathname) {
+const char* File::GetCanonicalPath(const char* pathname) {
char* abs_path = NULL;
if (pathname != NULL) {
+ char* resolved_path = DartUtils::ScopedCString(PATH_MAX + 1);
+ ASSERT(resolved_path != NULL);
do {
- abs_path = realpath(pathname, NULL);
+ abs_path = realpath(pathname, resolved_path);
} while (abs_path == NULL && errno == EINTR);
ASSERT(abs_path == NULL || IsAbsolutePath(abs_path));
+ ASSERT(abs_path == NULL || (abs_path == resolved_path));
}
return abs_path;
}
@@ -423,7 +439,7 @@ const char* File::StringEscapedPathSeparator() {
File::StdioHandleType File::GetStdioHandleType(int fd) {
- ASSERT(0 <= fd && fd <= 2);
+ ASSERT((0 <= fd) && (fd <= 2));
struct stat64 buf;
int result = TEMP_FAILURE_RETRY(fstat64(fd, &buf));
if (result == -1) {
@@ -432,10 +448,18 @@ File::StdioHandleType File::GetStdioHandleType(int fd) {
FATAL2("Failed stat on file descriptor %d: %s", fd,
Utils::StrError(errno, error_buf, kBufferSize));
}
- if (S_ISCHR(buf.st_mode)) return kTerminal;
- if (S_ISFIFO(buf.st_mode)) return kPipe;
- if (S_ISSOCK(buf.st_mode)) return kSocket;
- if (S_ISREG(buf.st_mode)) return kFile;
+ if (S_ISCHR(buf.st_mode)) {
+ return kTerminal;
+ }
+ if (S_ISFIFO(buf.st_mode)) {
+ return kPipe;
+ }
+ if (S_ISSOCK(buf.st_mode)) {
+ return kSocket;
+ }
+ if (S_ISREG(buf.st_mode)) {
+ return kFile;
+ }
return kOther;
}
@@ -448,10 +472,18 @@ File::Type File::GetType(const char* pathname, bool follow_links) {
} else {
stat_success = TEMP_FAILURE_RETRY(lstat64(pathname, &entry_info));
}
- if (stat_success == -1) return File::kDoesNotExist;
- if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
- if (S_ISREG(entry_info.st_mode)) return File::kIsFile;
- if (S_ISLNK(entry_info.st_mode)) return File::kIsLink;
+ if (stat_success == -1) {
+ return File::kDoesNotExist;
+ }
+ if (S_ISDIR(entry_info.st_mode)) {
+ return File::kIsDirectory;
+ }
+ if (S_ISREG(entry_info.st_mode)) {
+ return File::kIsFile;
+ }
+ if (S_ISLNK(entry_info.st_mode)) {
+ return File::kIsLink;
+ }
return File::kDoesNotExist;
}
@@ -459,12 +491,12 @@ File::Type File::GetType(const char* pathname, bool follow_links) {
File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
struct stat64 file_1_info;
struct stat64 file_2_info;
- if (TEMP_FAILURE_RETRY(lstat64(file_1, &file_1_info)) == -1 ||
- TEMP_FAILURE_RETRY(lstat64(file_2, &file_2_info)) == -1) {
+ if ((TEMP_FAILURE_RETRY(lstat64(file_1, &file_1_info)) == -1) ||
+ (TEMP_FAILURE_RETRY(lstat64(file_2, &file_2_info)) == -1)) {
return File::kError;
}
- return (file_1_info.st_ino == file_2_info.st_ino &&
- file_1_info.st_dev == file_2_info.st_dev) ?
+ return ((file_1_info.st_ino == file_2_info.st_ino) &&
+ (file_1_info.st_dev == file_2_info.st_dev)) ?
File::kIdentical :
File::kDifferent;
}
« no previous file with comments | « runtime/bin/file_android.cc ('k') | runtime/bin/file_macos.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698