Diff
Modified: trunk/Source/WebKit2/ChangeLog (140485 => 140486)
--- trunk/Source/WebKit2/ChangeLog 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/ChangeLog 2013-01-23 00:35:53 UTC (rev 140486)
@@ -1,3 +1,50 @@
+2013-01-22 Alexey Proskuryakov <[email protected]>
+
+ Move sandbox initialization to ChildProcess
+ https://bugs.webkit.org/show_bug.cgi?id=107486
+
+ Reviewed by Sam Weinig.
+
+ * NetworkProcess/NetworkProcess.h:
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::initializeSandbox): Removed. We no longer need this function
+ to be implemented in each process type.
+
+ * NetworkProcess/mac/NetworkProcessMac.mm:
+ (WebKit::initializeSandbox): Removed a custom (and incomplete) implementation.
+ (WebKit::NetworkProcess::processUpdateSandboxInitializationParameters): Clear
+ sandbox profile path in parameters, telling ChildProcess to not enter a sandbox.
+
+ * PluginProcess/PluginProcess.h:
+ * PluginProcess/mac/PluginProcessMac.mm:
+ Added FIXMEs, saying that we should switch to ChildProcess implementation.
+
+ * Shared/ChildProcess.cpp: Dummy implementations for other platforms.
+
+ * Shared/ChildProcess.h: Added processUpdateSandboxInitializationParameters, which
+ child processes will override to change sandbox initialization parameters.
+
+ * Shared/SandboxInitializationParameters.h: Added.
+ * Shared/mac/SandboxInitialiationParametersMac.mm: Added.
+ Abstracts out sandbox parameter vector for coding safety. Encapsulates other
+ things that subclasses will want to do differently.
+
+ * Shared/mac/ChildProcessMac.mm: (WebKit::ChildProcess::initializeSandbox):
+ Added a shared implementation, based largely on WebProcess version.
+
+ * SharedWorkerProcess/mac/SharedWorkerProcessMac.mm: Removed custom sandboxing code.
+
+ * WebKit2.xcodeproj/project.pbxproj: Added SandboxInitializationParameters files.
+
+ * WebProcess/WebProcess.cpp:
+ * WebProcess/WebProcess.h:
+ Updated dummy implementations to match ChildProcess.
+
+ * WebProcess/mac/WebProcessMac.mm:
+ (WebKit): Moved sandboxing code to ChildProcess.
+ (WebKit::WebProcess::processUpdateSandboxInitializationParameters): Override
+ profile path, because default one doesn't work for WebProcessService.
+
2013-01-22 Joseph Pecoraro <[email protected]>
[Mac] Enable Page Visibility (PAGE_VISIBILITY_API)
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp (140485 => 140486)
--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp 2013-01-23 00:35:53 UTC (rev 140486)
@@ -216,7 +216,7 @@
{
}
-void NetworkProcess::initializeSandbox(const ChildProcessInitializationParameters&)
+void NetworkProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&)
{
}
#endif
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h (140485 => 140486)
--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h 2013-01-23 00:35:53 UTC (rev 140486)
@@ -78,9 +78,9 @@
// ChildProcess
virtual void initializeProcessName(const ChildProcessInitializationParameters&) OVERRIDE;
- virtual void initializeSandbox(const ChildProcessInitializationParameters&) OVERRIDE;
virtual void initializeConnection(CoreIPC::Connection*) OVERRIDE;
virtual bool shouldTerminate() OVERRIDE;
+ virtual void processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) OVERRIDE;
// CoreIPC::Connection::Client
virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&) OVERRIDE;
Modified: trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm (140485 => 140486)
--- trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm 2013-01-23 00:35:53 UTC (rev 140486)
@@ -31,6 +31,7 @@
#import "NetworkProcessCreationParameters.h"
#import "PlatformCertificateInfo.h"
#import "SandboxExtension.h"
+#import "SandboxInitializationParameters.h"
#import "StringUtilities.h"
#import <WebCore/FileSystem.h>
#import <WebCore/LocalizedStrings.h>
@@ -64,37 +65,6 @@
}
}
-void NetworkProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters)
-{
- [[NSFileManager defaultManager] changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
-
-#if DEBUG_BYPASS_SANDBOX
- WTFLogAlways("Bypassing network process sandbox.\n");
- return;
-#endif
-
-#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
- // Use private temporary and cache directories.
- String systemDirectorySuffix = "com.apple.WebKit.NetworkProcess+" + parameters.clientIdentifier;
- setenv("DIRHELPER_USER_DIR_SUFFIX", fileSystemRepresentation(systemDirectorySuffix).data(), 0);
- char temporaryDirectory[PATH_MAX];
- if (!confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory))) {
- WTFLogAlways("NetworkProcess: couldn't retrieve private temporary directory path: %d\n", errno);
- exit(EX_NOPERM);
- }
- setenv("TMPDIR", temporaryDirectory, 1);
-#endif
-
- // FIXME (NetworkProcess): <rdar://problem/12772605> Actually initialize the sandbox.
-
- // This will override LSFileQuarantineEnabled from Info.plist unless sandbox quarantine is globally disabled.
- OSStatus error = WKEnableSandboxStyleFileQuarantine();
- if (error) {
- WTFLogAlways("NetworkProcess: Couldn't enable sandbox style file quarantine: %ld\n", (long)error);
- exit(EX_NOPERM);
- }
-}
-
#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
static void overrideSystemProxies(const String& httpProxy, const String& httpsProxy)
{
@@ -208,6 +178,12 @@
[NSURLRequest setAllowsSpecificHTTPSCertificate:(NSArray *)certificateInfo.certificateChain() forHost:(NSString *)host];
}
+// FIXME: Remove when the process has a profile.
+void NetworkProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters& parameters)
+{
+ parameters.setSandboxProfilePath(String());
+}
+
} // namespace WebKit
#endif // ENABLE(NETWORK_PROCESS)
Modified: trunk/Source/WebKit2/PluginProcess/PluginProcess.h (140485 => 140486)
--- trunk/Source/WebKit2/PluginProcess/PluginProcess.h 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/PluginProcess/PluginProcess.h 2013-01-23 00:35:53 UTC (rev 140486)
@@ -76,6 +76,9 @@
virtual void initializeProcess(const ChildProcessInitializationParameters&) OVERRIDE;
virtual bool shouldTerminate() OVERRIDE;
+ // FIXME: PluginProcess should switch to common code for sandbox initialization.
+ virtual void initializeSandbox(const ChildProcessInitializationParameters&) OVERRIDE { }
+
void platformInitializeProcess(const ChildProcessInitializationParameters&);
// CoreIPC::Connection::Client
Modified: trunk/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm (140485 => 140486)
--- trunk/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm 2013-01-23 00:35:53 UTC (rev 140486)
@@ -352,6 +352,7 @@
WKSetVisibleApplicationName((CFStringRef)applicationName);
+ // FIXME: Use ChildProcess::initializeSandbox.
WebKit::initializeSandbox(m_pluginPath, parameters.sandboxProfileDirectoryPath);
if (parameters.processType == TypeSnapshotProcess)
Modified: trunk/Source/WebKit2/Shared/ChildProcess.cpp (140485 => 140486)
--- trunk/Source/WebKit2/Shared/ChildProcess.cpp 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/Shared/ChildProcess.cpp 2013-01-23 00:35:53 UTC (rev 140486)
@@ -86,10 +86,16 @@
{
}
+#if !PLATFORM(MAC)
void ChildProcess::initializeSandbox(const ChildProcessInitializationParameters&)
{
}
+#endif
+void ChildProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&)
+{
+}
+
void ChildProcess::initializeConnection(CoreIPC::Connection*)
{
}
Modified: trunk/Source/WebKit2/Shared/ChildProcess.h (140485 => 140486)
--- trunk/Source/WebKit2/Shared/ChildProcess.h 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/Shared/ChildProcess.h 2013-01-23 00:35:53 UTC (rev 140486)
@@ -35,6 +35,8 @@
namespace WebKit {
+class SandboxInitializationParameters;
+
struct ChildProcessInitializationParameters {
String uiProcessName;
String clientIdentifier;
@@ -77,7 +79,6 @@
virtual void initializeProcess(const ChildProcessInitializationParameters&);
virtual void initializeProcessName(const ChildProcessInitializationParameters&);
- virtual void initializeSandbox(const ChildProcessInitializationParameters&);
virtual void initializeConnection(CoreIPC::Connection*);
virtual bool shouldTerminate() = 0;
@@ -87,6 +88,9 @@
void terminationTimerFired();
void platformInitialize();
+ // FIXME: This function is virtual only because PluginProcess needs to bypass it. It should switch to common code.
+ virtual void initializeSandbox(const ChildProcessInitializationParameters&);
+ virtual void processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&);
// The timeout, in seconds, before this process will be terminated if termination
// has been enabled. If the timeout is 0 seconds, the process will be terminated immediately.
Added: trunk/Source/WebKit2/Shared/SandboxInitializationParameters.h (0 => 140486)
--- trunk/Source/WebKit2/Shared/SandboxInitializationParameters.h (rev 0)
+++ trunk/Source/WebKit2/Shared/SandboxInitializationParameters.h 2013-01-23 00:35:53 UTC (rev 140486)
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SandboxInitializationParameters_h
+#define SandboxInitializationParameters_h
+
+#include <wtf/Vector.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebKit {
+
+class SandboxInitializationParameters {
+WTF_MAKE_NONCOPYABLE(SandboxInitializationParameters);
+public:
+
+#if PLATFORM(MAC)
+ SandboxInitializationParameters();
+ ~SandboxInitializationParameters();
+
+ // Name must be a literal.
+ void addConfDirectoryParameter(const char* name, int confID);
+ void addPathParameter(const char* name, NSString *path);
+ void addPathParameter(const char* name, const char* path);
+
+ const char* const* namedParameterArray() const;
+
+ size_t count() const;
+ const char* name(size_t index) const;
+ const char* value(size_t index) const;
+
+ void setSandboxProfilePath(const String& path) { m_sandboxProfilePath = path; m_sandboxProfile = String(); }
+ const String& sandboxProfilePath() const { return m_sandboxProfilePath; }
+
+ void setSandboxProfile(const String& profile) { m_sandboxProfilePath = String(); m_sandboxProfile = profile; }
+ const String& sandboxProfile() const { return m_sandboxProfile; }
+
+ void setSystemDirectorySuffix(const String& suffix) { m_systemDirectorySuffix = suffix; }
+ const String& systemDirectorySuffix() const { return m_systemDirectorySuffix; }
+#endif
+
+private:
+#if PLATFORM(MAC)
+ void appendPathInternal(const char* name, const char* path);
+
+ mutable Vector<const char*> m_namedParameters;
+ String m_systemDirectorySuffix;
+
+ String m_sandboxProfilePath;
+ String m_sandboxProfile;
+#endif
+};
+
+}
+
+#endif // SandboxInitializationParameters_h
Property changes on: trunk/Source/WebKit2/Shared/SandboxInitializationParameters.h
___________________________________________________________________
Added: svn:eol-style
Modified: trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm (140485 => 140486)
--- trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm 2013-01-23 00:35:53 UTC (rev 140486)
@@ -26,9 +26,23 @@
#import "config.h"
#import "ChildProcess.h"
+#import "SandboxInitializationParameters.h"
#import "WebKitSystemInterface.h"
+#import <WebCore/FileSystem.h>
#import <mach/task.h>
+#import <pwd.h>
+#import <stdlib.h>
+#import <sysexits.h>
+// We have to #undef __APPLE_API_PRIVATE to prevent sandbox.h from looking for a header file that does not exist (<rdar://problem/9679211>).
+#undef __APPLE_API_PRIVATE
+#import <sandbox.h>
+
+#define SANDBOX_NAMED_EXTERNAL 0x0003
+extern "C" int sandbox_init_with_parameters(const char *profile, uint64_t flags, const char *const parameters[], char **errorbuf);
+
+using namespace WebCore;
+
namespace WebKit {
void ChildProcess::setApplicationIsOccluded(bool applicationIsOccluded)
@@ -64,4 +78,73 @@
setApplicationIsOccluded(false);
}
+void ChildProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters)
+{
+ [[NSFileManager defaultManager] changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
+
+ SandboxInitializationParameters sandboxParameters;
+
+ NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
+ NSString *defaultProfilePath = [webkit2Bundle pathForResource:[[NSBundle mainBundle] bundleIdentifier] ofType:@"sb"];
+
+ sandboxParameters.setSandboxProfilePath(defaultProfilePath);
+
+ String defaultSystemDirectorySuffix = [[NSBundle mainBundle] bundleIdentifier] + parameters.clientIdentifier;
+ sandboxParameters.setSystemDirectorySuffix(defaultSystemDirectorySuffix);
+
+ sandboxParameters.addPathParameter("WEBKIT2_FRAMEWORK_DIR", [[webkit2Bundle bundlePath] stringByDeletingLastPathComponent]);
+ sandboxParameters.addConfDirectoryParameter("DARWIN_USER_TEMP_DIR", _CS_DARWIN_USER_TEMP_DIR);
+ sandboxParameters.addConfDirectoryParameter("DARWIN_USER_CACHE_DIR", _CS_DARWIN_USER_CACHE_DIR);
+
+ char buffer[4096];
+ int bufferSize = sizeof(buffer);
+ struct passwd pwd;
+ struct passwd* result = 0;
+ if (getpwuid_r(getuid(), &pwd, buffer, bufferSize, &result) || !result) {
+ WTFLogAlways("%s: Couldn't find home directory\n", getprogname());
+ exit(EX_NOPERM);
+ }
+
+ sandboxParameters.addPathParameter("HOME_DIR", pwd.pw_dir);
+
+ processUpdateSandboxInitializationParameters(parameters, sandboxParameters);
+
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
+ // Use private temporary and cache directories.
+ setenv("DIRHELPER_USER_DIR_SUFFIX", fileSystemRepresentation(sandboxParameters.systemDirectorySuffix()).data(), 0);
+ char temporaryDirectory[PATH_MAX];
+ if (!confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory))) {
+ WTFLogAlways("%s: couldn't retrieve private temporary directory path: %d\n", getprogname(), errno);
+ exit(EX_NOPERM);
+ }
+ setenv("TMPDIR", temporaryDirectory, 1);
+#endif
+
+ if (!sandboxParameters.sandboxProfilePath().isEmpty()) {
+ CString profilePath = fileSystemRepresentation(sandboxParameters.sandboxProfilePath());
+ char* errorBuf;
+ if (sandbox_init_with_parameters(profilePath.data(), SANDBOX_NAMED_EXTERNAL, sandboxParameters.namedParameterArray(), &errorBuf)) {
+ WTFLogAlways("%s: Couldn't initialize sandbox profile [%s], error '%s'\n", getprogname(), profilePath.data(), errorBuf);
+ for (size_t i = 0, count = sandboxParameters.count(); i != count; ++i)
+ WTFLogAlways("%s=%s\n", sandboxParameters.name(i), sandboxParameters.value(i));
+ exit(EX_NOPERM);
+ }
+ } else if (!sandboxParameters.sandboxProfile().isEmpty()) {
+ char* errorBuf;
+ if (sandbox_init_with_parameters(sandboxParameters.sandboxProfile().utf8().data(), 0, sandboxParameters.namedParameterArray(), &errorBuf)) {
+ WTFLogAlways("%s: Couldn't initialize sandbox profile, error '%s'\n", getprogname(), errorBuf);
+ for (size_t i = 0, count = sandboxParameters.count(); i != count; ++i)
+ WTFLogAlways("%s=%s\n", sandboxParameters.name(i), sandboxParameters.value(i));
+ exit(EX_NOPERM);
+ }
+ }
+
+ // This will override LSFileQuarantineEnabled from Info.plist unless sandbox quarantine is globally disabled.
+ OSStatus error = WKEnableSandboxStyleFileQuarantine();
+ if (error) {
+ WTFLogAlways("%s: Couldn't enable sandbox style file quarantine: %ld\n", getprogname(), (long)error);
+ exit(EX_NOPERM);
+ }
}
+
+}
Added: trunk/Source/WebKit2/Shared/mac/SandboxInitialiationParametersMac.mm (0 => 140486)
--- trunk/Source/WebKit2/Shared/mac/SandboxInitialiationParametersMac.mm (rev 0)
+++ trunk/Source/WebKit2/Shared/mac/SandboxInitialiationParametersMac.mm 2013-01-23 00:35:53 UTC (rev 140486)
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "SandboxInitializationParameters.h"
+
+namespace WebKit {
+
+SandboxInitializationParameters::SandboxInitializationParameters()
+{
+}
+
+SandboxInitializationParameters::~SandboxInitializationParameters()
+{
+ for (size_t i = 0; i + 1 < m_namedParameters.size(); i += 2)
+ fastFree(const_cast<char*>(m_namedParameters[i + 1]));
+}
+
+void SandboxInitializationParameters::appendPathInternal(const char* name, const char* path)
+{
+ char normalizedPath[PATH_MAX];
+ if (!realpath(path, normalizedPath))
+ normalizedPath[0] = '\0';
+
+ ASSERT(!(m_namedParameters.size() % 2));
+
+ m_namedParameters.append(name);
+ m_namedParameters.append(fastStrDup(normalizedPath));
+}
+
+void SandboxInitializationParameters::addConfDirectoryParameter(const char* name, int confID)
+{
+ char path[PATH_MAX];
+ if (confstr(confID, path, PATH_MAX) <= 0)
+ path[0] = '\0';
+
+ appendPathInternal(name, path);
+}
+
+void SandboxInitializationParameters::addPathParameter(const char* name, NSString *path)
+{
+ appendPathInternal(name, [path length] ? [(NSString *)path fileSystemRepresentation] : "");
+}
+
+void SandboxInitializationParameters::addPathParameter(const char* name, const char* path)
+{
+ appendPathInternal(name, path);
+}
+
+const char* const* SandboxInitializationParameters::namedParameterArray() const
+{
+ if (!(m_namedParameters.size() % 2))
+ m_namedParameters.append(static_cast<const char*>(0));
+
+ return m_namedParameters.data();
+}
+
+size_t SandboxInitializationParameters::count() const
+{
+ return m_namedParameters.size() / 2;
+}
+
+const char* SandboxInitializationParameters::name(size_t index) const
+{
+ ASSERT(index != m_namedParameters.size());
+ return m_namedParameters[index * 2];
+}
+
+const char* SandboxInitializationParameters::value(size_t index) const
+{
+ return m_namedParameters[index * 2 + 1];
+}
+
+}
Property changes on: trunk/Source/WebKit2/Shared/mac/SandboxInitialiationParametersMac.mm
___________________________________________________________________
Added: svn:eol-style
Modified: trunk/Source/WebKit2/SharedWorkerProcess/mac/SharedWorkerProcessMac.mm (140485 => 140486)
--- trunk/Source/WebKit2/SharedWorkerProcess/mac/SharedWorkerProcessMac.mm 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/SharedWorkerProcess/mac/SharedWorkerProcessMac.mm 2013-01-23 00:35:53 UTC (rev 140486)
@@ -46,18 +46,6 @@
namespace WebKit {
-static void initializeSandbox()
-{
- NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
- const char* profilePath = [[webkit2Bundle pathForResource:@"com.apple.WebKit.SharedWorkerProcess" ofType:@"sb"] fileSystemRepresentation];
-
- char* errorBuf;
- if (sandbox_init_with_parameters(profilePath, SANDBOX_NAMED_EXTERNAL, 0, &errorBuf)) {
- WTFLogAlways("SharedWorkerProcess: couldn't initialize sandbox profile [%s] error '%s'\n", profilePath, errorBuf);
- exit(EX_NOPERM);
- }
-}
-
void SharedWorkerProcess::platformInitializeSharedWorkerProcess(const SharedWorkerProcessCreationParameters& parameters)
{
NSString *applicationName = [NSString stringWithFormat:WEB_UI_STRING("Shared Web Worker (%@ Internet plug-in)",
@@ -65,8 +53,6 @@
(NSString *)parameters.parentProcessName];
WKSetVisibleApplicationName((CFStringRef)applicationName);
-
- WebKit::initializeSandbox();
}
} // namespace WebKit
Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (140485 => 140486)
--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2013-01-23 00:35:53 UTC (rev 140486)
@@ -1053,6 +1053,8 @@
E1B78473163F253E0007B692 /* RemoteNetworkingContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1B78472163F253E0007B692 /* RemoteNetworkingContext.mm */; };
E1CC1B9012D7EADF00625838 /* PrintInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E1CC1B8E12D7EADF00625838 /* PrintInfo.h */; };
E1CC1B9112D7EADF00625838 /* PrintInfoMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */; };
+ E1E552C416AE065F004ED653 /* SandboxInitialiationParametersMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */; };
+ E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */; };
E1EDFDA61628868E0039ECDA /* MainMacProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6FA31011E3921E00DB1371 /* MainMacProcess.cpp */; };
E1EDFDA7162886960039ECDA /* SharedWorkerProcessMainMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1EDFD9B16287D0B0039ECDA /* SharedWorkerProcessMainMac.mm */; };
E1EDFDA8162886990039ECDA /* SharedWorkerProcessMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1EDFDA21628838C0039ECDA /* SharedWorkerProcessMac.mm */; };
@@ -2374,6 +2376,8 @@
E1B78472163F253E0007B692 /* RemoteNetworkingContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RemoteNetworkingContext.mm; sourceTree = "<group>"; };
E1CC1B8E12D7EADF00625838 /* PrintInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrintInfo.h; sourceTree = "<group>"; };
E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PrintInfoMac.mm; sourceTree = "<group>"; };
+ E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SandboxInitialiationParametersMac.mm; sourceTree = "<group>"; };
+ E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SandboxInitializationParameters.h; sourceTree = "<group>"; };
E1EDFD9816287BD10039ECDA /* SharedWorkerProcessMain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedWorkerProcessMain.h; sourceTree = "<group>"; };
E1EDFD9B16287D0B0039ECDA /* SharedWorkerProcessMainMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SharedWorkerProcessMainMac.mm; sourceTree = "<group>"; };
E1EDFD9D16287F190039ECDA /* SharedWorkerProcess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedWorkerProcess.h; sourceTree = "<group>"; };
@@ -2833,6 +2837,7 @@
F6A0C13F13281E6E0070430F /* ResourceCachesToClear.h */,
BC2D021612AC41CB00E732A3 /* SameDocumentNavigationType.h */,
1AAB4A8C1296F0A20023952F /* SandboxExtension.h */,
+ E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */,
33152973130D0CB200ED2483 /* SecurityOriginData.cpp */,
33152974130D0CB200ED2483 /* SecurityOriginData.h */,
518D2CC812D51DFB003BB93B /* SessionState.cpp */,
@@ -3850,6 +3855,7 @@
1AF1AC6A1651759E00C17D7F /* RemoteLayerTreeTransaction.h */,
1AF1AC691651759E00C17D7F /* RemoteLayerTreeTransaction.mm */,
1AAB4AA91296F1540023952F /* SandboxExtensionMac.mm */,
+ E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */,
51D1304F1382EAC000351EDD /* SecItemRequestData.cpp */,
51D130501382EAC000351EDD /* SecItemRequestData.h */,
51D130511382EAC000351EDD /* SecItemResponseData.cpp */,
@@ -5051,6 +5057,7 @@
1A97E07616A5F9E0000BC9E5 /* LayerTreeHostMac.h in Headers */,
51815BA016A622210054501F /* SyncNetworkResourceLoader.h in Headers */,
519B4FF516A9EA970066874D /* SchedulableLoader.h in Headers */,
+ E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -6029,6 +6036,7 @@
1A97E07716A5F9E0000BC9E5 /* LayerTreeHostMac.mm in Sources */,
51815B9F16A622210054501F /* SyncNetworkResourceLoader.cpp in Sources */,
519B4FF416A9EA970066874D /* SchedulableLoader.cpp in Sources */,
+ E1E552C416AE065F004ED653 /* SandboxInitialiationParametersMac.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (140485 => 140486)
--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2013-01-23 00:35:53 UTC (rev 140486)
@@ -1079,7 +1079,7 @@
{
}
-void WebProcess::initializeSandbox(const ChildProcessInitializationParameters&)
+void WebProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&)
{
}
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (140485 => 140486)
--- trunk/Source/WebKit2/WebProcess/WebProcess.h 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h 2013-01-23 00:35:53 UTC (rev 140486)
@@ -266,14 +266,13 @@
// ChildProcess
virtual void initializeProcess(const ChildProcessInitializationParameters&) OVERRIDE;
virtual void initializeProcessName(const ChildProcessInitializationParameters&) OVERRIDE;
- virtual void initializeSandbox(const ChildProcessInitializationParameters&) OVERRIDE;
virtual void initializeConnection(CoreIPC::Connection*) OVERRIDE;
virtual bool shouldTerminate() OVERRIDE;
virtual void terminate() OVERRIDE;
+ virtual void processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) OVERRIDE;
void platformInitializeProcess(const ChildProcessInitializationParameters&);
-
// CoreIPC::Connection::Client
friend class WebConnectionToUIProcess;
virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&);
Modified: trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm (140485 => 140486)
--- trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm 2013-01-23 00:06:35 UTC (rev 140485)
+++ trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm 2013-01-23 00:35:53 UTC (rev 140486)
@@ -28,6 +28,7 @@
#import "CustomProtocolManager.h"
#import "SandboxExtension.h"
+#import "SandboxInitializationParameters.h"
#import "WKFullKeyboardAccessWatcher.h"
#import "WebInspector.h"
#import "WebPage.h"
@@ -51,23 +52,6 @@
#import "SecItemShim.h"
#endif
-#if ENABLE(WEB_PROCESS_SANDBOX)
-#import <pwd.h>
-#import <stdlib.h>
-#import <sysexits.h>
-
-// We have to #undef __APPLE_API_PRIVATE to prevent sandbox.h from looking for a header file that does not exist (<rdar://problem/9679211>).
-#undef __APPLE_API_PRIVATE
-#import <sandbox.h>
-
-#define SANDBOX_NAMED_EXTERNAL 0x0003
-extern "C" int sandbox_init_with_parameters(const char *profile, uint64_t flags, const char *const parameters[], char **errorbuf);
-
-// Define this to 1 to bypass the sandbox for debugging purposes.
-#define DEBUG_BYPASS_SANDBOX 0
-
-#endif
-
using namespace WebCore;
using namespace std;
@@ -154,108 +138,6 @@
});
}
-#if ENABLE(WEB_PROCESS_SANDBOX)
-static void appendSandboxParameterPathInternal(Vector<const char*>& vector, const char* name, const char* path)
-{
- char normalizedPath[PATH_MAX];
- if (!realpath(path, normalizedPath))
- normalizedPath[0] = '\0';
-
- vector.append(name);
- vector.append(fastStrDup(normalizedPath));
-}
-
-static void appendReadwriteConfDirectory(Vector<const char*>& vector, const char* name, int confID)
-{
- char path[PATH_MAX];
- if (confstr(confID, path, PATH_MAX) <= 0)
- path[0] = '\0';
-
- appendSandboxParameterPathInternal(vector, name, path);
-}
-
-static void appendReadonlySandboxDirectory(Vector<const char*>& vector, const char* name, NSString *path)
-{
- appendSandboxParameterPathInternal(vector, name, [path length] ? [(NSString *)path fileSystemRepresentation] : "");
-}
-
-static void appendReadwriteSandboxDirectory(Vector<const char*>& vector, const char* name, const char* path)
-{
- appendSandboxParameterPathInternal(vector, name, path);
-}
-
-#endif
-
-void WebProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters)
-{
- [[NSFileManager defaultManager] changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
-
-#if ENABLE(WEB_PROCESS_SANDBOX)
-
-#if DEBUG_BYPASS_SANDBOX
- WTFLogAlways("Bypassing web process sandbox.\n");
- return;
-#endif
-
-#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
- // Use private temporary and cache directories.
- String systemDirectorySuffix = "com.apple.WebProcess+" + parameters.clientIdentifier;
- setenv("DIRHELPER_USER_DIR_SUFFIX", fileSystemRepresentation(systemDirectorySuffix).data(), 0);
- char temporaryDirectory[PATH_MAX];
- if (!confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory))) {
- WTFLogAlways("WebProcess: couldn't retrieve private temporary directory path: %d\n", errno);
- exit(EX_NOPERM);
- }
- setenv("TMPDIR", temporaryDirectory, 1);
-#endif
-
- NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
-
- Vector<const char*> sandboxParameters;
-
- // These are read-only.
- appendReadonlySandboxDirectory(sandboxParameters, "WEBKIT2_FRAMEWORK_DIR", [[webkit2Bundle bundlePath] stringByDeletingLastPathComponent]);
-
- // These are read-write getconf paths.
- appendReadwriteConfDirectory(sandboxParameters, "DARWIN_USER_TEMP_DIR", _CS_DARWIN_USER_TEMP_DIR);
- appendReadwriteConfDirectory(sandboxParameters, "DARWIN_USER_CACHE_DIR", _CS_DARWIN_USER_CACHE_DIR);
-
- char buffer[4096];
- int bufferSize = sizeof(buffer);
- struct passwd pwd;
- struct passwd* result = 0;
- if (getpwuid_r(getuid(), &pwd, buffer, bufferSize, &result) || !result) {
- WTFLogAlways("WebProcess: Couldn't find home directory\n");
- exit(EX_NOPERM);
- }
-
- // These are read-write paths.
- appendReadwriteSandboxDirectory(sandboxParameters, "HOME_DIR", pwd.pw_dir);
-
- sandboxParameters.append(static_cast<const char*>(0));
-
- const char* profilePath = [[webkit2Bundle pathForResource:@"com.apple.WebProcess" ofType:@"sb"] fileSystemRepresentation];
-
- char* errorBuf;
- if (sandbox_init_with_parameters(profilePath, SANDBOX_NAMED_EXTERNAL, sandboxParameters.data(), &errorBuf)) {
- WTFLogAlways("WebProcess: Couldn't initialize sandbox profile [%s] error '%s'\n", profilePath, errorBuf);
- for (size_t i = 0; sandboxParameters[i]; i += 2)
- WTFLogAlways("%s=%s\n", sandboxParameters[i], sandboxParameters[i + 1]);
- exit(EX_NOPERM);
- }
-
- for (size_t i = 0; sandboxParameters[i]; i += 2)
- fastFree(const_cast<char*>(sandboxParameters[i + 1]));
-
- // This will override LSFileQuarantineEnabled from Info.plist unless sandbox quarantine is globally disabled.
- OSStatus error = WKEnableSandboxStyleFileQuarantine();
- if (error) {
- WTFLogAlways("WebProcess: Couldn't enable sandbox style file quarantine: %ld\n", (long)error);
- exit(EX_NOPERM);
- }
-#endif
-}
-
static id NSApplicationAccessibilityFocusedUIElement(NSApplication*, SEL)
{
WebPage* page = WebProcess::shared().focusedWebPage();
@@ -321,4 +203,11 @@
}
}
+void WebProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters& parameters)
+{
+ // Need to overide the default, because service has a different bundle ID.
+ NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
+ parameters.setSandboxProfilePath([webkit2Bundle pathForResource:@"com.apple.WebProcess" ofType:@"sb"]);
+}
+
} // namespace WebKit