<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[212850] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/212850">212850</a></dd>
<dt>Author</dt> <dd>andersca@apple.com</dd>
<dt>Date</dt> <dd>2017-02-22 13:49:54 -0800 (Wed, 22 Feb 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Crash if there's a mismatch between the WebKit used by the UI process and child processes respectively
https://bugs.webkit.org/show_bug.cgi?id=168739
Part of rdar://problem/30631411.

Reviewed by Geoffrey Garen.

If the UI process and web process for some reason end up using different versions of the WebKit framework, weird things happen
because the message format is different between versions. To avoid this, send along the WebKit bundle version from the UI process
in the XPC bootstrap message, check that it matches inside the XPC main functions. If there's a mismatch, crash.

* Shared/Cocoa/ChildProcessCocoa.mm:
(WebKit::ChildProcess::didReceiveInvalidMessage):
Fix parameters.

* Shared/EntryPointUtilities/mac/XPCService/XPCServiceMain.mm:
(main):
Check for the bundle version and crash if it's not what we expect.

* UIProcess/Launcher/mac/ProcessLauncherMac.mm:
(WebKit::ProcessLauncher::launchProcess):
Initialize the bundle version.

* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::_WKSetCrashReportApplicationSpecificInformation):
Export this so we can call it from the XPC services without having to link WKSI.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedCocoaChildProcessCocoamm">trunk/Source/WebKit2/Shared/Cocoa/ChildProcessCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2SharedEntryPointUtilitiesmacXPCServiceXPCServiceMainmm">trunk/Source/WebKit2/Shared/EntryPointUtilities/mac/XPCService/XPCServiceMain.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessLaunchermacProcessLauncherMacmm">trunk/Source/WebKit2/UIProcess/Launcher/mac/ProcessLauncherMac.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcesscocoaWebProcessCocoamm">trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (212849 => 212850)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-02-22 21:33:10 UTC (rev 212849)
+++ trunk/Source/WebKit2/ChangeLog        2017-02-22 21:49:54 UTC (rev 212850)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2017-02-22  Anders Carlsson  &lt;andersca@apple.com&gt;
+
+        Crash if there's a mismatch between the WebKit used by the UI process and child processes respectively
+        https://bugs.webkit.org/show_bug.cgi?id=168739
+        Part of rdar://problem/30631411.
+
+        Reviewed by Geoffrey Garen.
+
+        If the UI process and web process for some reason end up using different versions of the WebKit framework, weird things happen
+        because the message format is different between versions. To avoid this, send along the WebKit bundle version from the UI process
+        in the XPC bootstrap message, check that it matches inside the XPC main functions. If there's a mismatch, crash.
+
+        * Shared/Cocoa/ChildProcessCocoa.mm:
+        (WebKit::ChildProcess::didReceiveInvalidMessage):
+        Fix parameters.
+
+        * Shared/EntryPointUtilities/mac/XPCService/XPCServiceMain.mm:
+        (main):
+        Check for the bundle version and crash if it's not what we expect.
+
+        * UIProcess/Launcher/mac/ProcessLauncherMac.mm:
+        (WebKit::ProcessLauncher::launchProcess):
+        Initialize the bundle version.
+
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::_WKSetCrashReportApplicationSpecificInformation):
+        Export this so we can call it from the XPC services without having to link WKSI.
+
</ins><span class="cx"> 2017-02-22  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WK2] Call processDidBecomeUnresponsive delegate when a background process is unresponsive
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCocoaChildProcessCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/Cocoa/ChildProcessCocoa.mm (212849 => 212850)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/Cocoa/ChildProcessCocoa.mm        2017-02-22 21:33:10 UTC (rev 212849)
+++ trunk/Source/WebKit2/Shared/Cocoa/ChildProcessCocoa.mm        2017-02-22 21:49:54 UTC (rev 212850)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-void ChildProcess::didReceiveInvalidMessage(IPC::Connection&amp;, IPC::StringReference messageName, IPC::StringReference messageReceiverName)
</del><ins>+void ChildProcess::didReceiveInvalidMessage(IPC::Connection&amp;, IPC::StringReference messageReceiverName, IPC::StringReference messageName)
</ins><span class="cx"> {
</span><span class="cx">     WKSetCrashReportApplicationSpecificInformation((__bridge CFStringRef)[NSString stringWithFormat:@&quot;Received invalid message: '%s::%s'&quot;, messageReceiverName.toString().data(), messageName.toString().data()]);
</span><span class="cx">     CRASH();
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedEntryPointUtilitiesmacXPCServiceXPCServiceMainmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/EntryPointUtilities/mac/XPCService/XPCServiceMain.mm (212849 => 212850)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/EntryPointUtilities/mac/XPCService/XPCServiceMain.mm        2017-02-22 21:33:10 UTC (rev 212849)
+++ trunk/Source/WebKit2/Shared/EntryPointUtilities/mac/XPCService/XPCServiceMain.mm        2017-02-22 21:49:54 UTC (rev 212850)
</span><span class="lines">@@ -30,6 +30,9 @@
</span><span class="cx"> #import &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> #import &lt;wtf/spi/darwin/XPCSPI.h&gt;
</span><span class="cx"> 
</span><ins>+extern &quot;C&quot;
+void _WKSetCrashReportApplicationSpecificInformation(NSString *infoString);
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> static void XPCServiceEventHandler(xpc_connection_t peer)
</span><span class="lines">@@ -112,6 +115,18 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (bootstrap) {
</span><ins>+#if PLATFORM(MAC)
+        if (const char* webKitBundleVersion = xpc_dictionary_get_string(bootstrap.get(), &quot;WebKitBundleVersion&quot;)) {
+            CFBundleRef webKitBundle = CFBundleGetBundleWithIdentifier(CFSTR(&quot;com.apple.WebKit&quot;));
+            NSString *expectedBundleVersion = (NSString *)CFBundleGetValueForInfoDictionaryKey(webKitBundle, kCFBundleVersionKey);
+
+            if (strcmp(webKitBundleVersion, expectedBundleVersion.UTF8String)) {
+                _WKSetCrashReportApplicationSpecificInformation([NSString stringWithFormat:@&quot;WebKit framework version mismatch: '%s'&quot;, webKitBundleVersion]);
+                __builtin_trap();
+            }
+        }
+#endif
+
</ins><span class="cx">         if (xpc_object_t languages = xpc_dictionary_get_value(bootstrap.get(), &quot;OverrideLanguages&quot;)) {
</span><span class="cx">             @autoreleasepool {
</span><span class="cx">                 NSDictionary *existingArguments = [[NSUserDefaults standardUserDefaults] volatileDomainForName:NSArgumentDomain];
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessLaunchermacProcessLauncherMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Launcher/mac/ProcessLauncherMac.mm (212849 => 212850)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Launcher/mac/ProcessLauncherMac.mm        2017-02-22 21:33:10 UTC (rev 212849)
+++ trunk/Source/WebKit2/UIProcess/Launcher/mac/ProcessLauncherMac.mm        2017-02-22 21:49:54 UTC (rev 212850)
</span><span class="lines">@@ -132,6 +132,9 @@
</span><span class="cx">         xpc_dictionary_set_value(initializationMessage.get(), &quot;OverrideLanguages&quot;, languages.get());
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+#if PLATFORM(MAC)
+    xpc_dictionary_set_string(initializationMessage.get(), &quot;WebKitBundleVersion&quot;, [[NSBundle bundleWithIdentifier:@&quot;com.apple.WebKit&quot;].infoDictionary[(__bridge NSString *)kCFBundleVersionKey] UTF8String]);
+#endif
</ins><span class="cx">     xpc_connection_set_bootstrap(m_xpcConnection.get(), initializationMessage.get());
</span><span class="cx"> 
</span><span class="cx">     if (shouldLeakBoost(m_launchOptions)) {
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcesscocoaWebProcessCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm (212849 => 212850)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm        2017-02-22 21:33:10 UTC (rev 212849)
+++ trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm        2017-02-22 21:49:54 UTC (rev 212850)
</span><span class="lines">@@ -447,4 +447,12 @@
</span><span class="cx">     RELEASE_LOG(ProcessSuspension, &quot;%p - WebProcess::destroyRenderingResources() took %.2fms&quot;, this, (endTime - startTime) * 1000.0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// FIXME: This should live somewhere else, and it should have the implementation in line instead of calling out to WKSI.
+WK_EXTERN void _WKSetCrashReportApplicationSpecificInformation(NSString *infoString);
+
+void _WKSetCrashReportApplicationSpecificInformation(NSString *infoString)
+{
+    return WKSetCrashReportApplicationSpecificInformation((__bridge CFStringRef)infoString);
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre>
</div>
</div>

</body>
</html>