Title: [196066] trunk/Source/WebKit2
Revision
196066
Author
[email protected]
Date
2016-02-03 08:34:29 -0800 (Wed, 03 Feb 2016)

Log Message

REGRESSION (r194660): Legacy WebProcess crashes in ChildProcess::initializeSandbox()
https://bugs.webkit.org/show_bug.cgi?id=153734
<rdar://problem/24433179>

Reviewed by Dan Bernstein.

Fixes an issue where clients that used the legacy WebProcess bootstrapping process would crash.

Additionally, only consider the extra initialization parameter user-directory-suffix for
unsigned apps (e.g. WebKitTestRunner).

* Shared/mac/ChildProcessMac.mm:
(WebKit::ChildProcess::initializeSandbox):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (196065 => 196066)


--- trunk/Source/WebKit2/ChangeLog	2016-02-03 11:38:13 UTC (rev 196065)
+++ trunk/Source/WebKit2/ChangeLog	2016-02-03 16:34:29 UTC (rev 196066)
@@ -1,3 +1,19 @@
+2016-02-03  Daniel Bates  <[email protected]>
+
+        REGRESSION (r194660): Legacy WebProcess crashes in ChildProcess::initializeSandbox()
+        https://bugs.webkit.org/show_bug.cgi?id=153734
+        <rdar://problem/24433179>
+
+        Reviewed by Dan Bernstein.
+
+        Fixes an issue where clients that used the legacy WebProcess bootstrapping process would crash.
+
+        Additionally, only consider the extra initialization parameter user-directory-suffix for
+        unsigned apps (e.g. WebKitTestRunner).
+
+        * Shared/mac/ChildProcessMac.mm:
+        (WebKit::ChildProcess::initializeSandbox):
+
 2016-02-03  Csaba Osztrogonác  <[email protected]>
 
         Unreviewed speculative buildfix after r195979.

Modified: trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm (196065 => 196066)


--- trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm	2016-02-03 11:38:13 UTC (rev 196065)
+++ trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm	2016-02-03 16:34:29 UTC (rev 196066)
@@ -96,12 +96,9 @@
     String defaultProfilePath = [webkit2Bundle pathForResource:[[NSBundle mainBundle] bundleIdentifier] ofType:@"sb"];
 
     if (sandboxParameters.userDirectorySuffix().isNull()) {
-        auto userDirectorySuffix = parameters.extraInitializationData.find("user-directory-suffix");
-        if (userDirectorySuffix != parameters.extraInitializationData.end())
-            sandboxParameters.setUserDirectorySuffix([makeString(userDirectorySuffix->value, '/', String([[NSBundle mainBundle] bundleIdentifier])) fileSystemRepresentation]);
-        else {
-            String clientIdentifierToUse;
-            RetainPtr<SecCodeRef> code = findSecCodeForProcess(xpc_connection_get_pid(parameters.connectionIdentifier.xpcConnection.get()));
+        if (const OSObjectPtr<xpc_connection_t>& xpcConnection = parameters.connectionIdentifier.xpcConnection) {
+            pid_t clientProcessID = xpc_connection_get_pid(xpcConnection.get());
+            RetainPtr<SecCodeRef> code = findSecCodeForProcess(clientProcessID);
             RELEASE_ASSERT(code);
 
             CFStringRef appleSignedOrMacAppStoreSignedOrAppleDeveloperSignedRequirement = CFSTR("(anchor apple) or (anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9]) or (anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] and certificate leaf[field.1.2.840.113635.100.6.1.13])");
@@ -111,24 +108,27 @@
 
             status = SecCodeCheckValidity(code.get(), kSecCSDefaultFlags, signingRequirement);
             if (status == errSecSuccess) {
+                String clientIdentifierToUse;
                 CFDictionaryRef signingInfo = nullptr;
-                if (!SecCodeCopySigningInformation(code.get(), kSecCSDefaultFlags, &signingInfo)) {
-                    if (CFDictionaryRef plist = dynamic_cf_cast<CFDictionaryRef>(CFDictionaryGetValue(signingInfo, kSecCodeInfoPList)))
-                        clientIdentifierToUse = String(dynamic_cf_cast<CFStringRef>(CFDictionaryGetValue(plist, kCFBundleIdentifierKey)));
-                    else
-                        clientIdentifierToUse = String(dynamic_cf_cast<CFStringRef>(CFDictionaryGetValue(signingInfo, kSecCodeInfoIdentifier)));
-                    CFRelease(signingInfo);
-                }
+                status = SecCodeCopySigningInformation(code.get(), kSecCSDefaultFlags, &signingInfo);
+                RELEASE_ASSERT(status == errSecSuccess);
+                if (CFDictionaryRef plist = dynamic_cf_cast<CFDictionaryRef>(CFDictionaryGetValue(signingInfo, kSecCodeInfoPList)))
+                    clientIdentifierToUse = String(dynamic_cf_cast<CFStringRef>(CFDictionaryGetValue(plist, kCFBundleIdentifierKey)));
+                else
+                    clientIdentifierToUse = String(dynamic_cf_cast<CFStringRef>(CFDictionaryGetValue(signingInfo, kSecCodeInfoIdentifier)));
+                CFRelease(signingInfo);
+                RELEASE_ASSERT(!clientIdentifierToUse.isEmpty());
+                sandboxParameters.setUserDirectorySuffix(makeString(String([[NSBundle mainBundle] bundleIdentifier]), '+', clientIdentifierToUse));
             } else {
                 // Unsigned, signed by a third party, or has an invalid/malformed signature
-                clientIdentifierToUse = parameters.clientIdentifier;
+                auto userDirectorySuffix = parameters.extraInitializationData.find("user-directory-suffix");
+                if (userDirectorySuffix != parameters.extraInitializationData.end())
+                    sandboxParameters.setUserDirectorySuffix([makeString(userDirectorySuffix->value, '/', String([[NSBundle mainBundle] bundleIdentifier])) fileSystemRepresentation]);
+                sandboxParameters.setUserDirectorySuffix(makeString(String([[NSBundle mainBundle] bundleIdentifier]), '+', parameters.clientIdentifier));
             }
-            CFRelease(signingRequirement);
-            if (clientIdentifierToUse.isEmpty()) {
-                WTFLogAlways("%s: Couldn't get code signed identifier for client: %d\n", getprogname(), status);
-                exit(EX_NOPERM);
-            }
-            sandboxParameters.setUserDirectorySuffix(makeString(String([[NSBundle mainBundle] bundleIdentifier]), '+', clientIdentifierToUse));
+        } else {
+            // Legacy client
+            sandboxParameters.setUserDirectorySuffix(makeString(String([[NSBundle mainBundle] bundleIdentifier]), '+', parameters.clientIdentifier));
         }
     }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to