⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 140486 in webkit


Ignore:
Timestamp:
Jan 22, 2013, 4:35:53 PM (14 years ago)
Author:
ap@apple.com
Message:

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.
Location:
trunk/Source/WebKit2
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r140469 r140486  
     12013-01-22  Alexey Proskuryakov  <ap@apple.com>
     2
     3        Move sandbox initialization to ChildProcess
     4        https://bugs.webkit.org/show_bug.cgi?id=107486
     5
     6        Reviewed by Sam Weinig.
     7
     8        * NetworkProcess/NetworkProcess.h:
     9        * NetworkProcess/NetworkProcess.cpp:
     10        (WebKit::NetworkProcess::initializeSandbox): Removed. We no longer need this function
     11        to be implemented in each process type.
     12
     13        * NetworkProcess/mac/NetworkProcessMac.mm:
     14        (WebKit::initializeSandbox): Removed a custom (and incomplete) implementation.
     15        (WebKit::NetworkProcess::processUpdateSandboxInitializationParameters): Clear
     16        sandbox profile path in parameters, telling ChildProcess to not enter a sandbox.
     17
     18        * PluginProcess/PluginProcess.h:
     19        * PluginProcess/mac/PluginProcessMac.mm:
     20        Added FIXMEs, saying that we should switch to ChildProcess implementation.
     21
     22        * Shared/ChildProcess.cpp: Dummy implementations for other platforms.
     23
     24        * Shared/ChildProcess.h: Added processUpdateSandboxInitializationParameters, which
     25        child processes will override to change sandbox initialization parameters.
     26
     27        * Shared/SandboxInitializationParameters.h: Added.
     28        * Shared/mac/SandboxInitialiationParametersMac.mm: Added.
     29        Abstracts out sandbox parameter vector for coding safety. Encapsulates other
     30        things that subclasses will want to do differently.
     31
     32        * Shared/mac/ChildProcessMac.mm: (WebKit::ChildProcess::initializeSandbox):
     33        Added a shared implementation, based largely on WebProcess version.
     34
     35        * SharedWorkerProcess/mac/SharedWorkerProcessMac.mm: Removed custom sandboxing code.
     36
     37        * WebKit2.xcodeproj/project.pbxproj: Added SandboxInitializationParameters files.
     38
     39        * WebProcess/WebProcess.cpp:
     40        * WebProcess/WebProcess.h:
     41        Updated dummy implementations to match ChildProcess.
     42
     43        * WebProcess/mac/WebProcessMac.mm:
     44        (WebKit): Moved sandboxing code to ChildProcess.
     45        (WebKit::WebProcess::processUpdateSandboxInitializationParameters): Override
     46        profile path, because default one doesn't work for WebProcessService.
     47
    1482013-01-22  Joseph Pecoraro  <pecoraro@apple.com>
    249
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp

    r139066 r140486  
    217217}
    218218
    219 void NetworkProcess::initializeSandbox(const ChildProcessInitializationParameters&)
     219void NetworkProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&)
    220220{
    221221}
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h

    r139066 r140486  
    7979    // ChildProcess
    8080    virtual void initializeProcessName(const ChildProcessInitializationParameters&) OVERRIDE;
    81     virtual void initializeSandbox(const ChildProcessInitializationParameters&) OVERRIDE;
    8281    virtual void initializeConnection(CoreIPC::Connection*) OVERRIDE;
    8382    virtual bool shouldTerminate() OVERRIDE;
     83    virtual void processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) OVERRIDE;
    8484
    8585    // CoreIPC::Connection::Client
  • trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm

    r139241 r140486  
    3232#import "PlatformCertificateInfo.h"
    3333#import "SandboxExtension.h"
     34#import "SandboxInitializationParameters.h"
    3435#import "StringUtilities.h"
    3536#import <WebCore/FileSystem.h>
     
    6263        NSString *applicationName = [NSString stringWithFormat:WEB_UI_STRING("%@ Networking", "visible name of the network process. The argument is the application name."), (NSString *)parameters.uiProcessName];
    6364        WKSetVisibleApplicationName((CFStringRef)applicationName);
    64     }
    65 }
    66 
    67 void NetworkProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters)
    68 {
    69     [[NSFileManager defaultManager] changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
    70 
    71 #if DEBUG_BYPASS_SANDBOX
    72     WTFLogAlways("Bypassing network process sandbox.\n");
    73     return;
    74 #endif
    75 
    76 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
    77     // Use private temporary and cache directories.
    78     String systemDirectorySuffix = "com.apple.WebKit.NetworkProcess+" + parameters.clientIdentifier;
    79     setenv("DIRHELPER_USER_DIR_SUFFIX", fileSystemRepresentation(systemDirectorySuffix).data(), 0);
    80     char temporaryDirectory[PATH_MAX];
    81     if (!confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory))) {
    82         WTFLogAlways("NetworkProcess: couldn't retrieve private temporary directory path: %d\n", errno);
    83         exit(EX_NOPERM);
    84     }
    85     setenv("TMPDIR", temporaryDirectory, 1);
    86 #endif
    87 
    88     // FIXME (NetworkProcess): <rdar://problem/12772605> Actually initialize the sandbox.
    89 
    90     // This will override LSFileQuarantineEnabled from Info.plist unless sandbox quarantine is globally disabled.
    91     OSStatus error = WKEnableSandboxStyleFileQuarantine();
    92     if (error) {
    93         WTFLogAlways("NetworkProcess: Couldn't enable sandbox style file quarantine: %ld\n", (long)error);
    94         exit(EX_NOPERM);
    9565    }
    9666}
     
    209179}
    210180
     181// FIXME: Remove when the process has a profile.
     182void NetworkProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters& parameters)
     183{
     184    parameters.setSandboxProfilePath(String());
     185}
     186
    211187} // namespace WebKit
    212188
  • trunk/Source/WebKit2/PluginProcess/PluginProcess.h

    r139076 r140486  
    7777    virtual bool shouldTerminate() OVERRIDE;
    7878
     79    // FIXME: PluginProcess should switch to common code for sandbox initialization.
     80    virtual void initializeSandbox(const ChildProcessInitializationParameters&) OVERRIDE { }
     81
    7982    void platformInitializeProcess(const ChildProcessInitializationParameters&);
    8083
  • trunk/Source/WebKit2/PluginProcess/mac/PluginProcessMac.mm

    r140274 r140486  
    353353    WKSetVisibleApplicationName((CFStringRef)applicationName);
    354354
     355    // FIXME: Use ChildProcess::initializeSandbox.
    355356    WebKit::initializeSandbox(m_pluginPath, parameters.sandboxProfileDirectoryPath);
    356357
  • trunk/Source/WebKit2/Shared/ChildProcess.cpp

    r140351 r140486  
    8787}
    8888
     89#if !PLATFORM(MAC)
    8990void ChildProcess::initializeSandbox(const ChildProcessInitializationParameters&)
     91{
     92}
     93#endif
     94
     95void ChildProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&)
    9096{
    9197}
  • trunk/Source/WebKit2/Shared/ChildProcess.h

    r139257 r140486  
    3535
    3636namespace WebKit {
     37
     38class SandboxInitializationParameters;
    3739
    3840struct ChildProcessInitializationParameters {
     
    7880    virtual void initializeProcess(const ChildProcessInitializationParameters&);
    7981    virtual void initializeProcessName(const ChildProcessInitializationParameters&);
    80     virtual void initializeSandbox(const ChildProcessInitializationParameters&);
    8182    virtual void initializeConnection(CoreIPC::Connection*);
    8283
     
    8889
    8990    void platformInitialize();
     91    // FIXME: This function is virtual only because PluginProcess needs to bypass it. It should switch to common code.
     92    virtual void initializeSandbox(const ChildProcessInitializationParameters&);
     93    virtual void processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&);
    9094
    9195    // The timeout, in seconds, before this process will be terminated if termination
  • trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm

    r139888 r140486  
    2727#import "ChildProcess.h"
    2828
     29#import "SandboxInitializationParameters.h"
    2930#import "WebKitSystemInterface.h"
     31#import <WebCore/FileSystem.h>
    3032#import <mach/task.h>
     33#import <pwd.h>
     34#import <stdlib.h>
     35#import <sysexits.h>
     36
     37// We have to #undef __APPLE_API_PRIVATE to prevent sandbox.h from looking for a header file that does not exist (<rdar://problem/9679211>).
     38#undef __APPLE_API_PRIVATE
     39#import <sandbox.h>
     40
     41#define SANDBOX_NAMED_EXTERNAL 0x0003
     42extern "C" int sandbox_init_with_parameters(const char *profile, uint64_t flags, const char *const parameters[], char **errorbuf);
     43
     44using namespace WebCore;
    3145
    3246namespace WebKit {
     
    6579}
    6680
     81void ChildProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters)
     82{
     83    [[NSFileManager defaultManager] changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
     84
     85    SandboxInitializationParameters sandboxParameters;
     86
     87    NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
     88    NSString *defaultProfilePath = [webkit2Bundle pathForResource:[[NSBundle mainBundle] bundleIdentifier] ofType:@"sb"];
     89
     90    sandboxParameters.setSandboxProfilePath(defaultProfilePath);
     91
     92    String defaultSystemDirectorySuffix = [[NSBundle mainBundle] bundleIdentifier] + parameters.clientIdentifier;
     93    sandboxParameters.setSystemDirectorySuffix(defaultSystemDirectorySuffix);
     94
     95    sandboxParameters.addPathParameter("WEBKIT2_FRAMEWORK_DIR", [[webkit2Bundle bundlePath] stringByDeletingLastPathComponent]);
     96    sandboxParameters.addConfDirectoryParameter("DARWIN_USER_TEMP_DIR", _CS_DARWIN_USER_TEMP_DIR);
     97    sandboxParameters.addConfDirectoryParameter("DARWIN_USER_CACHE_DIR", _CS_DARWIN_USER_CACHE_DIR);
     98
     99    char buffer[4096];
     100    int bufferSize = sizeof(buffer);
     101    struct passwd pwd;
     102    struct passwd* result = 0;
     103    if (getpwuid_r(getuid(), &pwd, buffer, bufferSize, &result) || !result) {
     104        WTFLogAlways("%s: Couldn't find home directory\n", getprogname());
     105        exit(EX_NOPERM);
     106    }
     107
     108    sandboxParameters.addPathParameter("HOME_DIR", pwd.pw_dir);
     109
     110    processUpdateSandboxInitializationParameters(parameters, sandboxParameters);
     111
     112#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
     113    // Use private temporary and cache directories.
     114    setenv("DIRHELPER_USER_DIR_SUFFIX", fileSystemRepresentation(sandboxParameters.systemDirectorySuffix()).data(), 0);
     115    char temporaryDirectory[PATH_MAX];
     116    if (!confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory))) {
     117        WTFLogAlways("%s: couldn't retrieve private temporary directory path: %d\n", getprogname(), errno);
     118        exit(EX_NOPERM);
     119    }
     120    setenv("TMPDIR", temporaryDirectory, 1);
     121#endif
     122
     123    if (!sandboxParameters.sandboxProfilePath().isEmpty()) {
     124        CString profilePath = fileSystemRepresentation(sandboxParameters.sandboxProfilePath());
     125        char* errorBuf;
     126        if (sandbox_init_with_parameters(profilePath.data(), SANDBOX_NAMED_EXTERNAL, sandboxParameters.namedParameterArray(), &errorBuf)) {
     127            WTFLogAlways("%s: Couldn't initialize sandbox profile [%s], error '%s'\n", getprogname(), profilePath.data(), errorBuf);
     128            for (size_t i = 0, count = sandboxParameters.count(); i != count; ++i)
     129                WTFLogAlways("%s=%s\n", sandboxParameters.name(i), sandboxParameters.value(i));
     130            exit(EX_NOPERM);
     131        }
     132    } else if (!sandboxParameters.sandboxProfile().isEmpty()) {
     133        char* errorBuf;
     134        if (sandbox_init_with_parameters(sandboxParameters.sandboxProfile().utf8().data(), 0, sandboxParameters.namedParameterArray(), &errorBuf)) {
     135            WTFLogAlways("%s: Couldn't initialize sandbox profile, error '%s'\n", getprogname(), errorBuf);
     136            for (size_t i = 0, count = sandboxParameters.count(); i != count; ++i)
     137                WTFLogAlways("%s=%s\n", sandboxParameters.name(i), sandboxParameters.value(i));
     138            exit(EX_NOPERM);
     139        }
     140    }
     141
     142    // This will override LSFileQuarantineEnabled from Info.plist unless sandbox quarantine is globally disabled.
     143    OSStatus error = WKEnableSandboxStyleFileQuarantine();
     144    if (error) {
     145        WTFLogAlways("%s: Couldn't enable sandbox style file quarantine: %ld\n", getprogname(), (long)error);
     146        exit(EX_NOPERM);
     147    }
    67148}
     149
     150}
  • trunk/Source/WebKit2/SharedWorkerProcess/mac/SharedWorkerProcessMac.mm

    r138868 r140486  
    4747namespace WebKit {
    4848
    49 static void initializeSandbox()
    50 {
    51     NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
    52     const char* profilePath = [[webkit2Bundle pathForResource:@"com.apple.WebKit.SharedWorkerProcess" ofType:@"sb"] fileSystemRepresentation];
    53 
    54     char* errorBuf;
    55     if (sandbox_init_with_parameters(profilePath, SANDBOX_NAMED_EXTERNAL, 0, &errorBuf)) {
    56         WTFLogAlways("SharedWorkerProcess: couldn't initialize sandbox profile [%s] error '%s'\n", profilePath, errorBuf);
    57         exit(EX_NOPERM);
    58     }
    59 }
    60 
    6149void SharedWorkerProcess::platformInitializeSharedWorkerProcess(const SharedWorkerProcessCreationParameters& parameters)
    6250{
     
    6654   
    6755    WKSetVisibleApplicationName((CFStringRef)applicationName);
    68 
    69     WebKit::initializeSandbox();
    7056}
    7157
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r140285 r140486  
    10541054                E1CC1B9012D7EADF00625838 /* PrintInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E1CC1B8E12D7EADF00625838 /* PrintInfo.h */; };
    10551055                E1CC1B9112D7EADF00625838 /* PrintInfoMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */; };
     1056                E1E552C416AE065F004ED653 /* SandboxInitialiationParametersMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */; };
     1057                E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */; };
    10561058                E1EDFDA61628868E0039ECDA /* MainMacProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6FA31011E3921E00DB1371 /* MainMacProcess.cpp */; };
    10571059                E1EDFDA7162886960039ECDA /* SharedWorkerProcessMainMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1EDFD9B16287D0B0039ECDA /* SharedWorkerProcessMainMac.mm */; };
     
    23752377                E1CC1B8E12D7EADF00625838 /* PrintInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrintInfo.h; sourceTree = "<group>"; };
    23762378                E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PrintInfoMac.mm; sourceTree = "<group>"; };
     2379                E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SandboxInitialiationParametersMac.mm; sourceTree = "<group>"; };
     2380                E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SandboxInitializationParameters.h; sourceTree = "<group>"; };
    23772381                E1EDFD9816287BD10039ECDA /* SharedWorkerProcessMain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedWorkerProcessMain.h; sourceTree = "<group>"; };
    23782382                E1EDFD9B16287D0B0039ECDA /* SharedWorkerProcessMainMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SharedWorkerProcessMainMac.mm; sourceTree = "<group>"; };
     
    28342838                                BC2D021612AC41CB00E732A3 /* SameDocumentNavigationType.h */,
    28352839                                1AAB4A8C1296F0A20023952F /* SandboxExtension.h */,
     2840                                E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */,
    28362841                                33152973130D0CB200ED2483 /* SecurityOriginData.cpp */,
    28372842                                33152974130D0CB200ED2483 /* SecurityOriginData.h */,
     
    38513856                                1AF1AC691651759E00C17D7F /* RemoteLayerTreeTransaction.mm */,
    38523857                                1AAB4AA91296F1540023952F /* SandboxExtensionMac.mm */,
     3858                                E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */,
    38533859                                51D1304F1382EAC000351EDD /* SecItemRequestData.cpp */,
    38543860                                51D130501382EAC000351EDD /* SecItemRequestData.h */,
     
    50525058                                51815BA016A622210054501F /* SyncNetworkResourceLoader.h in Headers */,
    50535059                                519B4FF516A9EA970066874D /* SchedulableLoader.h in Headers */,
     5060                                E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */,
    50545061                        );
    50555062                        runOnlyForDeploymentPostprocessing = 0;
     
    60306037                                51815B9F16A622210054501F /* SyncNetworkResourceLoader.cpp in Sources */,
    60316038                                519B4FF416A9EA970066874D /* SchedulableLoader.cpp in Sources */,
     6039                                E1E552C416AE065F004ED653 /* SandboxInitialiationParametersMac.mm in Sources */,
    60326040                        );
    60336041                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/WebKit2/WebProcess/WebProcess.cpp

    r140081 r140486  
    10801080}
    10811081
    1082 void WebProcess::initializeSandbox(const ChildProcessInitializationParameters&)
     1082void WebProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&)
    10831083{
    10841084}
  • trunk/Source/WebKit2/WebProcess/WebProcess.h

    r139023 r140486  
    267267    virtual void initializeProcess(const ChildProcessInitializationParameters&) OVERRIDE;
    268268    virtual void initializeProcessName(const ChildProcessInitializationParameters&) OVERRIDE;
    269     virtual void initializeSandbox(const ChildProcessInitializationParameters&) OVERRIDE;
    270269    virtual void initializeConnection(CoreIPC::Connection*) OVERRIDE;
    271270    virtual bool shouldTerminate() OVERRIDE;
    272271    virtual void terminate() OVERRIDE;
     272    virtual void processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) OVERRIDE;
    273273
    274274    void platformInitializeProcess(const ChildProcessInitializationParameters&);
    275 
    276275
    277276    // CoreIPC::Connection::Client
  • trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm

    r140230 r140486  
    2929#import "CustomProtocolManager.h"
    3030#import "SandboxExtension.h"
     31#import "SandboxInitializationParameters.h"
    3132#import "WKFullKeyboardAccessWatcher.h"
    3233#import "WebInspector.h"
     
    5253#endif
    5354
    54 #if ENABLE(WEB_PROCESS_SANDBOX)
    55 #import <pwd.h>
    56 #import <stdlib.h>
    57 #import <sysexits.h>
    58 
    59 // We have to #undef __APPLE_API_PRIVATE to prevent sandbox.h from looking for a header file that does not exist (<rdar://problem/9679211>).
    60 #undef __APPLE_API_PRIVATE
    61 #import <sandbox.h>
    62 
    63 #define SANDBOX_NAMED_EXTERNAL 0x0003
    64 extern "C" int sandbox_init_with_parameters(const char *profile, uint64_t flags, const char *const parameters[], char **errorbuf);
    65 
    66 // Define this to 1 to bypass the sandbox for debugging purposes.
    67 #define DEBUG_BYPASS_SANDBOX 0
    68 
    69 #endif
    70 
    7155using namespace WebCore;
    7256using namespace std;
     
    155139}
    156140
    157 #if ENABLE(WEB_PROCESS_SANDBOX)
    158 static void appendSandboxParameterPathInternal(Vector<const char*>& vector, const char* name, const char* path)
    159 {
    160     char normalizedPath[PATH_MAX];
    161     if (!realpath(path, normalizedPath))
    162         normalizedPath[0] = '\0';
    163 
    164     vector.append(name);
    165     vector.append(fastStrDup(normalizedPath));
    166 }
    167 
    168 static void appendReadwriteConfDirectory(Vector<const char*>& vector, const char* name, int confID)
    169 {
    170     char path[PATH_MAX];
    171     if (confstr(confID, path, PATH_MAX) <= 0)
    172         path[0] = '\0';
    173 
    174     appendSandboxParameterPathInternal(vector, name, path);
    175 }
    176 
    177 static void appendReadonlySandboxDirectory(Vector<const char*>& vector, const char* name, NSString *path)
    178 {
    179     appendSandboxParameterPathInternal(vector, name, [path length] ? [(NSString *)path fileSystemRepresentation] : "");
    180 }
    181 
    182 static void appendReadwriteSandboxDirectory(Vector<const char*>& vector, const char* name, const char* path)
    183 {
    184     appendSandboxParameterPathInternal(vector, name, path);
    185 }
    186 
    187 #endif
    188 
    189 void WebProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters)
    190 {
    191     [[NSFileManager defaultManager] changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
    192 
    193 #if ENABLE(WEB_PROCESS_SANDBOX)
    194 
    195 #if DEBUG_BYPASS_SANDBOX
    196     WTFLogAlways("Bypassing web process sandbox.\n");
    197     return;
    198 #endif
    199 
    200 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
    201     // Use private temporary and cache directories.
    202     String systemDirectorySuffix = "com.apple.WebProcess+" + parameters.clientIdentifier;
    203     setenv("DIRHELPER_USER_DIR_SUFFIX", fileSystemRepresentation(systemDirectorySuffix).data(), 0);
    204     char temporaryDirectory[PATH_MAX];
    205     if (!confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory))) {
    206         WTFLogAlways("WebProcess: couldn't retrieve private temporary directory path: %d\n", errno);
    207         exit(EX_NOPERM);
    208     }
    209     setenv("TMPDIR", temporaryDirectory, 1);
    210 #endif
    211 
    212     NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
    213 
    214     Vector<const char*> sandboxParameters;
    215 
    216     // These are read-only.
    217     appendReadonlySandboxDirectory(sandboxParameters, "WEBKIT2_FRAMEWORK_DIR", [[webkit2Bundle bundlePath] stringByDeletingLastPathComponent]);
    218 
    219     // These are read-write getconf paths.
    220     appendReadwriteConfDirectory(sandboxParameters, "DARWIN_USER_TEMP_DIR", _CS_DARWIN_USER_TEMP_DIR);
    221     appendReadwriteConfDirectory(sandboxParameters, "DARWIN_USER_CACHE_DIR", _CS_DARWIN_USER_CACHE_DIR);
    222 
    223     char buffer[4096];
    224     int bufferSize = sizeof(buffer);
    225     struct passwd pwd;
    226     struct passwd* result = 0;
    227     if (getpwuid_r(getuid(), &pwd, buffer, bufferSize, &result) || !result) {
    228         WTFLogAlways("WebProcess: Couldn't find home directory\n");
    229         exit(EX_NOPERM);
    230     }
    231 
    232     // These are read-write paths.
    233     appendReadwriteSandboxDirectory(sandboxParameters, "HOME_DIR", pwd.pw_dir);
    234 
    235     sandboxParameters.append(static_cast<const char*>(0));
    236 
    237     const char* profilePath = [[webkit2Bundle pathForResource:@"com.apple.WebProcess" ofType:@"sb"] fileSystemRepresentation];
    238 
    239     char* errorBuf;
    240     if (sandbox_init_with_parameters(profilePath, SANDBOX_NAMED_EXTERNAL, sandboxParameters.data(), &errorBuf)) {
    241         WTFLogAlways("WebProcess: Couldn't initialize sandbox profile [%s] error '%s'\n", profilePath, errorBuf);
    242         for (size_t i = 0; sandboxParameters[i]; i += 2)
    243             WTFLogAlways("%s=%s\n", sandboxParameters[i], sandboxParameters[i + 1]);
    244         exit(EX_NOPERM);
    245     }
    246 
    247     for (size_t i = 0; sandboxParameters[i]; i += 2)
    248         fastFree(const_cast<char*>(sandboxParameters[i + 1]));
    249 
    250     // This will override LSFileQuarantineEnabled from Info.plist unless sandbox quarantine is globally disabled.
    251     OSStatus error = WKEnableSandboxStyleFileQuarantine();
    252     if (error) {
    253         WTFLogAlways("WebProcess: Couldn't enable sandbox style file quarantine: %ld\n", (long)error);
    254         exit(EX_NOPERM);
    255     }
    256 #endif
    257 }
    258 
    259141static id NSApplicationAccessibilityFocusedUIElement(NSApplication*, SEL)
    260142{
     
    322204}
    323205
     206void WebProcess::processUpdateSandboxInitializationParameters(const ChildProcessInitializationParameters&, SandboxInitializationParameters& parameters)
     207{
     208    // Need to overide the default, because service has a different bundle ID.
     209    NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")];
     210    parameters.setSandboxProfilePath([webkit2Bundle pathForResource:@"com.apple.WebProcess" ofType:@"sb"]);
     211}
     212
    324213} // namespace WebKit
Note: See TracChangeset for help on using the changeset viewer.