summaryrefslogtreecommitdiffstats
path: root/base/base_paths_mac.mm
diff options
context:
space:
mode:
authorthomasvl@chromium.org <thomasvl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-24 21:32:35 +0000
committerthomasvl@chromium.org <thomasvl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-24 21:32:35 +0000
commita684921f6f193d14e19fff8e6a4f506b39c6dd25 (patch)
treea5894f10bc9f226091cba55e6a20acdda2c15ba3 /base/base_paths_mac.mm
parent182bd9a5fd7a9f031c9c88aba15fbe17475236fb (diff)
downloadchromium_src-a684921f6f193d14e19fff8e6a4f506b39c6dd25.zip
chromium_src-a684921f6f193d14e19fff8e6a4f506b39c6dd25.tar.gz
chromium_src-a684921f6f193d14e19fff8e6a4f506b39c6dd25.tar.bz2
[Mac] if someone overrides FILE_EXE/DIR_EXE in the path service, it can cause the calculation for DIR_SOURCE_ROOT to go wrong. Avoid this by not using the value from the path service.
BUG=52918 TEST=green tree Review URL: http://codereview.chromium.org/3176036 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@57237 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/base_paths_mac.mm')
-rw-r--r--base/base_paths_mac.mm63
1 files changed, 39 insertions, 24 deletions
diff --git a/base/base_paths_mac.mm b/base/base_paths_mac.mm
index df9f362..793bece 100644
--- a/base/base_paths_mac.mm
+++ b/base/base_paths_mac.mm
@@ -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