| Index: chrome/common/sandbox_mac.mm
|
| diff --git a/chrome/common/sandbox_mac.mm b/chrome/common/sandbox_mac.mm
|
| index bc0929e088b7331ff313db465a5630b2f5a8be0b..3d2985c0d96ae74085ce0d86c4640212d2568702 100644
|
| --- a/chrome/common/sandbox_mac.mm
|
| +++ b/chrome/common/sandbox_mac.mm
|
| @@ -10,6 +10,7 @@
|
| extern "C" {
|
| #include <sandbox.h>
|
| }
|
| +#include <sys/param.h>
|
|
|
| #include "base/basictypes.h"
|
| #include "base/command_line.h"
|
| @@ -118,20 +119,19 @@ bool QuotePlainString(const std::string& str_utf8, std::string* dst) {
|
| //
|
| // Returns: true on success, false otherwise.
|
| bool QuoteStringForRegex(const std::string& str_utf8, std::string* dst) {
|
| - // List of chars with special meaning to regex.
|
| - // This list is derived from http://perldoc.perl.org/perlre.html .
|
| + // Characters with special meanings in sandbox profile syntax.
|
| const char regex_special_chars[] = {
|
| '\\',
|
|
|
| // Metacharacters
|
| '^',
|
| '.',
|
| + '[',
|
| + ']',
|
| '$',
|
| - '|',
|
| '(',
|
| ')',
|
| - '[',
|
| - ']',
|
| + '|',
|
|
|
| // Quantifiers
|
| '*',
|
| @@ -345,14 +345,11 @@ bool EnableSandbox(SandboxProcessType sandbox_type,
|
| // needed so the caller doesn't need to worry about things like /var
|
| // being a link to /private/var (like in the paths CreateNewTempDirectory()
|
| // returns).
|
| - FilePath allowed_dir_absolute(allowed_dir);
|
| - if (!file_util::AbsolutePath(&allowed_dir_absolute)) {
|
| - PLOG(FATAL) << "Failed to resolve absolute path";
|
| - return false;
|
| - }
|
| + FilePath allowed_dir_canonical(allowed_dir);
|
| + GetCanonicalSandboxPath(&allowed_dir_canonical);
|
|
|
| std::string allowed_dir_escaped;
|
| - if (!QuoteStringForRegex(allowed_dir_absolute.value(),
|
| + if (!QuoteStringForRegex(allowed_dir_canonical.value(),
|
| &allowed_dir_escaped)) {
|
| LOG(FATAL) << "Regex string quoting failed " << allowed_dir.value();
|
| return false;
|
| @@ -384,8 +381,12 @@ bool EnableSandbox(SandboxProcessType sandbox_type,
|
| // If we ever need this on pre-10.6 OSs then we'll have to rethink the
|
| // surrounding sandbox syntax.
|
| std::string home_dir = base::SysNSStringToUTF8(NSHomeDirectory());
|
| +
|
| + FilePath home_dir_canonical(home_dir);
|
| + GetCanonicalSandboxPath(&home_dir_canonical);
|
| +
|
| std::string home_dir_escaped;
|
| - if (!QuotePlainString(home_dir, &home_dir_escaped)) {
|
| + if (!QuotePlainString(home_dir_canonical.value(), &home_dir_escaped)) {
|
| LOG(FATAL) << "Sandbox string quoting failed";
|
| return false;
|
| }
|
| @@ -411,4 +412,23 @@ bool EnableSandbox(SandboxProcessType sandbox_type,
|
| return success;
|
| }
|
|
|
| +void GetCanonicalSandboxPath(FilePath* path) {
|
| + int fd = HANDLE_EINTR(open(path->value().c_str(), O_RDONLY));
|
| + if (fd < 0) {
|
| + PLOG(FATAL) << "GetCanonicalSandboxPath() failed for: "
|
| + << path->value();
|
| + return;
|
| + }
|
| + file_util::ScopedFD file_closer(&fd);
|
| +
|
| + FilePath::CharType canonical_path[MAXPATHLEN];
|
| + if (HANDLE_EINTR(fcntl(fd, F_GETPATH, canonical_path)) != 0) {
|
| + PLOG(FATAL) << "GetCanonicalSandboxPath() failed for: "
|
| + << path->value();
|
| + return;
|
| + }
|
| +
|
| + *path = FilePath(canonical_path);
|
| +}
|
| +
|
| } // namespace sandbox
|
|
|