Crash during interrupted process termination
authorbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Jun 2018 20:47:17 +0000 (20:47 +0000)
committerbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Jun 2018 20:47:17 +0000 (20:47 +0000)
https://bugs.webkit.org/show_bug.cgi?id=185373
<rdar://problem/40019480>

Reviewed by Alex Christensen.

It's possible to encounter a crash if a user agent feature (such as Safari's responsiveness timer) decides
to kill a Web Process around the same time that a user decides to trigger a new page load. One of the two
termination operations may attempt to call methods on a nulled process pointer.

We can avoid this by holding our own reference to the terminating process until the termination steps have
been completed.

* UIProcess/API/C/WKPage.cpp:
(WKPageTerminate): Ref<> the active process while the termination call is performed.
* UIProcess/API/Cocoa/WKWebView.mm:
([WKWebView _killWebContentProcessAndResetState]): Ditto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@232808 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/API/C/WKPage.cpp
Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

index e676741..2478621 100644 (file)
@@ -1,3 +1,23 @@
+2018-06-13  Brent Fulgham  <bfulgham@apple.com>
+
+        Crash during interrupted process termination
+        https://bugs.webkit.org/show_bug.cgi?id=185373
+        <rdar://problem/40019480>
+
+        Reviewed by Alex Christensen.
+
+        It's possible to encounter a crash if a user agent feature (such as Safari's responsiveness timer) decides
+        to kill a Web Process around the same time that a user decides to trigger a new page load. One of the two
+        termination operations may attempt to call methods on a nulled process pointer.
+
+        We can avoid this by holding our own reference to the terminating process until the termination steps have
+        been completed.
+
+        * UIProcess/API/C/WKPage.cpp:
+        (WKPageTerminate): Ref<> the active process while the termination call is performed.
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        ([WKWebView _killWebContentProcessAndResetState]): Ditto.
+
 2018-06-13  Brian Burg  <bburg@apple.com>
 
         [Cocoa] Web Automation: wrong modifiers sent for 'Help' virtual key
index 78c5e1d..fd03b02 100644 (file)
@@ -413,7 +413,8 @@ void WKPageSetCustomTextEncodingName(WKPageRef pageRef, WKStringRef encodingName
 
 void WKPageTerminate(WKPageRef pageRef)
 {
-    toImpl(pageRef)->process().requestTermination(ProcessTerminationReason::RequestedByClient);
+    Ref<WebProcessProxy> protectedProcessProxy(toImpl(pageRef)->process());
+    protectedProcessProxy->requestTermination(ProcessTerminationReason::RequestedByClient);
 }
 
 WKStringRef WKPageGetSessionHistoryURLValueType()
index 3cae569..30f4d82 100644 (file)
@@ -4300,7 +4300,8 @@ WEBCORE_COMMAND(yankAndSelect)
 
 - (void)_killWebContentProcessAndResetState
 {
-    _page->process().requestTermination(WebKit::ProcessTerminationReason::RequestedByClient);
+    Ref<WebKit::WebProcessProxy> protectedProcessProxy(_page->process());
+    protectedProcessProxy->requestTermination(WebKit::ProcessTerminationReason::RequestedByClient);
 }
 
 #if PLATFORM(MAC)