diff options
author | thomasvl@chromium.org <thomasvl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-24 21:32:35 +0000 |
---|---|---|
committer | thomasvl@chromium.org <thomasvl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-24 21:32:35 +0000 |
commit | a684921f6f193d14e19fff8e6a4f506b39c6dd25 (patch) | |
tree | a5894f10bc9f226091cba55e6a20acdda2c15ba3 /base | |
parent | 182bd9a5fd7a9f031c9c88aba15fbe17475236fb (diff) | |
download | chromium_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')
-rw-r--r-- | base/base_paths_mac.mm | 63 |
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 |