Crash in many WebKit apps marking a connection invalid under Messages::NetworkProcess...
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 22 Jul 2017 00:15:00 +0000 (00:15 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 22 Jul 2017 00:15:00 +0000 (00:15 +0000)
<rdar://problem/28822272> and https://bugs.webkit.org/show_bug.cgi?id=174729

Reviewed by Tim Horton.

Previously, when a NetworkLoad generated a "CanAuthenticateAgainstProtectionSpace" event, the message went from
Network process -> Web process -> UI process.

In that case, MESSAGE_CHECKing the validity of the frame in WebPageProxy made sense.

In r202511 we cut the WebProcess out of this and had Networking go straight to UI process.

As a result, the message check became invalid. The Networking process cannot possible know the validity of
particular WebPage or WebFrame identifiers.

We simply need to validate the input in NetworkProcessProxy.

* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::canAuthenticateAgainstProtectionSpace): Validate both the page and frame ids before
  passing the call along to the WebPageProxy. Also, if either of those validations fail, respond to the network process.

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

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

index ff57933..51fc6cf 100644 (file)
@@ -1,3 +1,26 @@
+2017-07-21  Brady Eidson  <beidson@apple.com>
+
+        Crash in many WebKit apps marking a connection invalid under Messages::NetworkProcessProxy::canAuthenticateAgainstProtectionSpace.
+        <rdar://problem/28822272> and https://bugs.webkit.org/show_bug.cgi?id=174729
+
+        Reviewed by Tim Horton.
+
+        Previously, when a NetworkLoad generated a "CanAuthenticateAgainstProtectionSpace" event, the message went from
+        Network process -> Web process -> UI process.
+
+        In that case, MESSAGE_CHECKing the validity of the frame in WebPageProxy made sense.
+
+        In r202511 we cut the WebProcess out of this and had Networking go straight to UI process.
+
+        As a result, the message check became invalid. The Networking process cannot possible know the validity of 
+        particular WebPage or WebFrame identifiers.
+
+        We simply need to validate the input in NetworkProcessProxy.
+
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::canAuthenticateAgainstProtectionSpace): Validate both the page and frame ids before
+          passing the call along to the WebPageProxy. Also, if either of those validations fail, respond to the network process.
+
 2017-07-21  Andy Estes  <aestes@apple.com>
 
         [iOS] Adopt UIImagePickerControllerImageURL for photo uploads
index 8c8f833..46d4b2b 100644 (file)
@@ -367,11 +367,20 @@ void NetworkProcessProxy::logDiagnosticMessageWithValue(uint64_t pageID, const S
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
 void NetworkProcessProxy::canAuthenticateAgainstProtectionSpace(uint64_t loaderID, uint64_t pageID, uint64_t frameID, const WebCore::ProtectionSpace& protectionSpace)
 {
-    WebPageProxy* page = WebProcessProxy::webPage(pageID);
-    if (!page)
-        return;
+    // NetworkProcess state cannot asynchronously be kept in sync with these objects
+    // like we expect WebProcess <-> UIProcess state to be kept in sync.
+    // So there's no guarantee the messaged WebPageProxy or WebFrameProxy exist here in the UIProcess.
+    // We need to validate both the page and the frame up front.
+    if (auto* page = WebProcessProxy::webPage(pageID)) {
+        if (page->process().webFrame(frameID)) {
+            page->canAuthenticateAgainstProtectionSpace(loaderID, frameID, protectionSpace);
+            return;
+        }
+    }
     
-    page->canAuthenticateAgainstProtectionSpace(loaderID, frameID, protectionSpace);
+    // In the case where we will not be able to reply to this message with a client reply,
+    // we should message back a default to the Networking process.
+    send(Messages::NetworkProcess::ContinueCanAuthenticateAgainstProtectionSpace(loaderID, false), 0);
 }
 #endif