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

Unified Diff: base/base_paths_mac.mm

Issue 3176036: [Mac] if someone overrides FILE_EXE/DIR_EXE in the path service, it can cause... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 4 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/base_paths_mac.mm
===================================================================
--- base/base_paths_mac.mm (revision 57207)
+++ base/base_paths_mac.mm (working copy)
@@ -7,6 +7,7 @@
#import <Cocoa/Cocoa.h>
#include <mach-o/dyld.h>
+#include "base/compiler_specific.h"
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/logging.h"
@@ -14,48 +15,62 @@
#include "base/path_service.h"
#include "base/string_util.h"
+namespace {
+
+bool GetNSExecutablePath(FilePath* path) WARN_UNUSED_RESULT;
+
+bool GetNSExecutablePath(FilePath* path) {
+ DCHECK(path);
+ // Executable path can have relative references ("..") depending on
+ // how the app was launched.
+ uint32_t executable_length = 0;
+ _NSGetExecutablePath(NULL, &executable_length);
+ DCHECK_GE(executable_length, 1u);
+ std::string executable_path;
+ char* executable_path_c = WriteInto(&executable_path, executable_length);
+ int rv = _NSGetExecutablePath(executable_path_c, &executable_length);
+ DCHECK_EQ(rv, 0);
+ DCHECK(!executable_path.empty());
+ if ((rv != 0) || (executable_path.empty()))
+ return false;
+ *path = FilePath(executable_path);
+ return true;
+}
+
+} // namespace
+
namespace base {
bool PathProviderMac(int key, FilePath* result) {
- std::string cur;
switch (key) {
case base::FILE_EXE:
case base::FILE_MODULE: {
- // Executable path can have relative references ("..") depending on
- // how the app was launched.
- uint32_t executable_length = 0;
- _NSGetExecutablePath(NULL, &executable_length);
- DCHECK_GT(executable_length, 1u);
- char* executable = WriteInto(&cur, executable_length);
- int rv = _NSGetExecutablePath(executable, &executable_length);
- DCHECK_EQ(rv, 0);
- DCHECK(!cur.empty());
- break;
+ return GetNSExecutablePath(result);
}
case base::DIR_USER_CACHE:
return mac_util::GetUserDirectory(NSCachesDirectory, result);
case base::DIR_APP_DATA:
return mac_util::GetUserDirectory(NSApplicationSupportDirectory, result);
case base::DIR_SOURCE_ROOT: {
- PathService::Get(base::DIR_EXE, result);
- if (mac_util::AmIBundled()) {
- // The bundled app executables (Chromium, TestShell, etc) live five
- // levels down, eg:
- // src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium.
- *result = result->DirName().DirName().DirName().DirName().DirName();
- } else {
- // Unit tests execute two levels deep from the source root, eg:
- // src/xcodebuild/{Debug|Release}/base_unittests
- *result = result->DirName().DirName();
+ if (GetNSExecutablePath(result)) {
+ // Start with the executable's directory.
+ *result = result->DirName();
+ if (mac_util::AmIBundled()) {
+ // The bundled app executables (Chromium, TestShell, etc) live five
+ // levels down, eg:
+ // src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium
+ *result = result->DirName().DirName().DirName().DirName().DirName();
+ } else {
+ // Unit tests execute two levels deep from the source root, eg:
+ // src/xcodebuild/{Debug|Release}/base_unittests
+ *result = result->DirName().DirName();
+ }
}
return true;
}
default:
return false;
}
-
- *result = FilePath(cur);
- return true;
}
} // namespace base
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698