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

Unified Diff: runtime/bin/directory_macos.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/directory_linux.cc ('k') | runtime/bin/directory_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/directory_macos.cc
diff --git a/runtime/bin/directory_macos.cc b/runtime/bin/directory_macos.cc
index 55994aa79abdd26998d52d5f3a4de0f706bd918a..a10b20a98a350adef41242d6462417ea8cffa80f 100644
--- a/runtime/bin/directory_macos.cc
+++ b/runtime/bin/directory_macos.cc
@@ -14,34 +14,46 @@
#include <sys/stat.h> // NOLINT
#include <unistd.h> // NOLINT
+#include "bin/dartutils.h"
#include "bin/file.h"
#include "bin/platform.h"
-
#include "platform/signal_blocker.h"
-
namespace dart {
namespace bin {
-
PathBuffer::PathBuffer() : length_(0) {
- data_ = calloc(PATH_MAX + 1, sizeof(char)); // NOLINT
+ data_ = calloc(PATH_MAX + 1, sizeof(char)); // NOLINT
+}
+
+
+PathBuffer::~PathBuffer() {
+ free(data_);
}
+
bool PathBuffer::AddW(const wchar_t* name) {
UNREACHABLE();
return false;
}
+
char* PathBuffer::AsString() const {
return reinterpret_cast<char*>(data_);
}
+
wchar_t* PathBuffer::AsStringW() const {
UNREACHABLE();
return NULL;
}
+
+const char* PathBuffer::AsScopedString() const {
+ return DartUtils::ScopedCopyCString(AsString());
+}
+
+
bool PathBuffer::Add(const char* name) {
char* data = AsString();
int written = snprintf(data + length_,
@@ -49,9 +61,9 @@ bool PathBuffer::Add(const char* name) {
"%s",
name);
data[PATH_MAX] = '\0';
- if (written <= PATH_MAX - length_ &&
- written >= 0 &&
- static_cast<size_t>(written) == strlen(name)) {
+ if ((written <= PATH_MAX - length_) &&
+ (written >= 0) &&
+ (static_cast<size_t>(written) == strlen(name))) {
length_ += written;
return true;
} else {
@@ -60,7 +72,8 @@ bool PathBuffer::Add(const char* name) {
}
}
-void PathBuffer::Reset(int new_length) {
+
+void PathBuffer::Reset(intptr_t new_length) {
length_ = new_length;
AsString()[length_] = '\0';
}
@@ -84,7 +97,7 @@ ListType DirectoryListingEntry::Next(DirectoryListing* listing) {
do {
lister_ = reinterpret_cast<intptr_t>(
opendir(listing->path_buffer().AsString()));
- } while (lister_ == 0 && errno == EINTR);
+ } while ((lister_ == 0) && (errno == EINTR));
if (lister_ == 0) {
done_ = true;
@@ -106,18 +119,19 @@ ListType DirectoryListingEntry::Next(DirectoryListing* listing) {
int status = 0;
dirent entry;
dirent* result;
- if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
- &entry,
- &result))) == 0 &&
- result != NULL) {
+ status = NO_RETRY_EXPECTED(readdir_r(
+ reinterpret_cast<DIR*>(lister_), &entry, &result));
+ if ((status == 0) && (result != NULL)) {
if (!listing->path_buffer().Add(entry.d_name)) {
done_ = true;
return kListError;
}
switch (entry.d_type) {
case DT_DIR:
- if (strcmp(entry.d_name, ".") == 0) return Next(listing);
- if (strcmp(entry.d_name, "..") == 0) return Next(listing);
+ if ((strcmp(entry.d_name, ".") == 0) ||
+ (strcmp(entry.d_name, "..") == 0)) {
+ return Next(listing);
+ }
return kListDirectory;
case DT_REG:
return kListFile;
@@ -146,8 +160,8 @@ ListType DirectoryListingEntry::Next(DirectoryListing* listing) {
link_ };
LinkList* previous = link_;
while (previous != NULL) {
- if (previous->dev == current_link.dev &&
- previous->ino == current_link.ino) {
+ if ((previous->dev == current_link.dev) &&
+ (previous->ino == current_link.ino)) {
// Report the looping link as a link, rather than following it.
return kListLink;
}
@@ -163,14 +177,18 @@ ListType DirectoryListingEntry::Next(DirectoryListing* listing) {
// Recurse into the subdirectory with current_link added to the
// linked list of seen file system links.
link_ = new LinkList(current_link);
- if (strcmp(entry.d_name, ".") == 0) return Next(listing);
- if (strcmp(entry.d_name, "..") == 0) return Next(listing);
+ if ((strcmp(entry.d_name, ".") == 0) ||
+ (strcmp(entry.d_name, "..") == 0)) {
+ return Next(listing);
+ }
return kListDirectory;
}
}
if (S_ISDIR(entry_info.st_mode)) {
- if (strcmp(entry.d_name, ".") == 0) return Next(listing);
- if (strcmp(entry.d_name, "..") == 0) return Next(listing);
+ if ((strcmp(entry.d_name, ".") == 0) ||
+ (strcmp(entry.d_name, "..") == 0)) {
+ return Next(listing);
+ }
return kListDirectory;
} else if (S_ISREG(entry_info.st_mode)) {
return kListFile;
@@ -203,7 +221,7 @@ DirectoryListingEntry::~DirectoryListingEntry() {
void DirectoryListingEntry::ResetLink() {
- if (link_ != NULL && (parent_ == NULL || parent_->link_ != link_)) {
+ if ((link_ != NULL) && ((parent_ == NULL) || (parent_->link_ != link_))) {
delete link_;
link_ = NULL;
}
@@ -218,14 +236,15 @@ static bool DeleteRecursively(PathBuffer* path);
static bool DeleteFile(char* file_name,
PathBuffer* path) {
- return path->Add(file_name) && unlink(path->AsString()) == 0;
+ return path->Add(file_name) && (unlink(path->AsString()) == 0);
}
static bool DeleteDir(char* dir_name,
PathBuffer* path) {
- if (strcmp(dir_name, ".") == 0) return true;
- if (strcmp(dir_name, "..") == 0) return true;
+ if ((strcmp(dir_name, ".") == 0) || (strcmp(dir_name, "..") == 0)) {
+ return true;
+ }
return path->Add(dir_name) && DeleteRecursively(path);
}
@@ -240,14 +259,16 @@ static bool DeleteRecursively(PathBuffer* path) {
return (unlink(path->AsString()) == 0);
}
- if (!path->Add(File::PathSeparator())) return false;
+ if (!path->Add(File::PathSeparator())) {
+ return false;
+ }
// Not a link. Attempt to open as a directory and recurse into the
// directory.
DIR* dir_pointer;
do {
dir_pointer = opendir(path->AsString());
- } while (dir_pointer == NULL && errno == EINTR);
+ } while ((dir_pointer == NULL) && (errno == EINTR));
if (dir_pointer == NULL) {
return false;
}
@@ -259,8 +280,8 @@ static bool DeleteRecursively(PathBuffer* path) {
while (NO_RETRY_EXPECTED(readdir_r(dir_pointer, &entry, &result)) == 0) {
if (result == NULL) {
// End of directory.
- return NO_RETRY_EXPECTED(closedir(dir_pointer)) == 0 &&
- NO_RETRY_EXPECTED(remove(path->AsString())) == 0;
+ return (NO_RETRY_EXPECTED(closedir(dir_pointer)) == 0) &&
+ (NO_RETRY_EXPECTED(remove(path->AsString())) == 0);
}
bool ok = false;
switch (entry.d_type) {
@@ -323,30 +344,37 @@ Directory::ExistsResult Directory::Exists(const char* dir_name) {
return DOES_NOT_EXIST;
}
} else {
- if (errno == EACCES ||
- errno == EBADF ||
- errno == EFAULT ||
- errno == ENOMEM ||
- errno == EOVERFLOW) {
+ if ((errno == EACCES) ||
+ (errno == EBADF) ||
+ (errno == EFAULT) ||
+ (errno == ENOMEM) ||
+ (errno == EOVERFLOW)) {
// Search permissions denied for one of the directories in the
// path or a low level error occured. We do not know if the
// directory exists.
return UNKNOWN;
}
- ASSERT(errno == ELOOP ||
- errno == ENAMETOOLONG ||
- errno == ENOENT ||
- errno == ENOTDIR);
+ ASSERT((errno == ELOOP) ||
+ (errno == ENAMETOOLONG) ||
+ (errno == ENOENT) ||
+ (errno == ENOTDIR));
return DOES_NOT_EXIST;
}
}
-char* Directory::Current() {
+char* Directory::CurrentNoScope() {
return getcwd(NULL, 0);
}
+const char* Directory::Current() {
+ char* result = DartUtils::ScopedCString(PATH_MAX);
+ ASSERT(result != NULL);
+ return getcwd(result, PATH_MAX);
+}
+
+
bool Directory::SetCurrent(const char* path) {
int result = NO_RETRY_EXPECTED(chdir(path));
return result == 0;
@@ -358,14 +386,15 @@ bool Directory::Create(const char* dir_name) {
// process umask.
int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
// If the directory already exists, treat it as a success.
- if (result == -1 && errno == EEXIST) {
+ if ((result == -1) && (errno == EEXIST)) {
return (Exists(dir_name) == EXISTS);
}
return (result == 0);
}
-char* Directory::SystemTemp() {
+const char* Directory::SystemTemp() {
+ PathBuffer path;
const char* temp_dir = getenv("TMPDIR");
if (temp_dir == NULL) {
temp_dir = getenv("TMP");
@@ -373,23 +402,28 @@ char* Directory::SystemTemp() {
if (temp_dir == NULL) {
temp_dir = "/tmp";
}
- char* result = strdup(temp_dir);
+ if (!path.Add(temp_dir)) {
+ return NULL;
+ }
// Remove any trailing slash.
+ char* result = path.AsString();
int length = strlen(result);
- if (length > 1 && result[length - 1] == '/') {
+ if ((length > 1) && (result[length - 1] == '/')) {
result[length - 1] = '\0';
}
- return result;
+ return path.AsScopedString();
}
-char* Directory::CreateTemp(const char* prefix) {
+const char* Directory::CreateTemp(const char* prefix) {
// Returns a new, unused directory name, adding characters to the end
// of prefix. Creates the directory with the permissions specified
// by the process umask.
- // The return value must be freed by the caller.
+ // The return value is Dart_ScopeAllocated.
PathBuffer path;
- path.Add(prefix);
+ if (!path.Add(prefix)) {
+ return NULL;
+ }
if (!path.Add("XXXXXX")) {
// Pattern has overflowed.
return NULL;
@@ -397,18 +431,18 @@ char* Directory::CreateTemp(const char* prefix) {
char* result;
do {
result = mkdtemp(path.AsString());
- } while (result == NULL && errno == EINTR);
+ } while ((result == NULL) && (errno == EINTR));
if (result == NULL) {
return NULL;
}
- return strdup(result);
+ return path.AsScopedString();
}
bool Directory::Delete(const char* dir_name, bool recursive) {
if (!recursive) {
- if (File::GetType(dir_name, false) == File::kIsLink &&
- File::GetType(dir_name, true) == File::kIsDirectory) {
+ if ((File::GetType(dir_name, false) == File::kIsLink) &&
+ (File::GetType(dir_name, true) == File::kIsDirectory)) {
return (NO_RETRY_EXPECTED(unlink(dir_name)) == 0);
}
return (NO_RETRY_EXPECTED(rmdir(dir_name)) == 0);
@@ -424,7 +458,9 @@ bool Directory::Delete(const char* dir_name, bool recursive) {
bool Directory::Rename(const char* path, const char* new_path) {
ExistsResult exists = Exists(path);
- if (exists != EXISTS) return false;
+ if (exists != EXISTS) {
+ return false;
+ }
return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0);
}
« no previous file with comments | « runtime/bin/directory_linux.cc ('k') | runtime/bin/directory_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698