Title: [274186] trunk/Source/WebKit
Revision
274186
Author
achristen...@apple.com
Date
2021-03-09 16:40:08 -0800 (Tue, 09 Mar 2021)

Log Message

REGRESSION (r272376): [iOS] ASSERTION FAILED: sessionID.isEphemeral() || !path.isEmpty() in WebKit::NetworkProcess::swServerForSession
https://bugs.webkit.org/show_bug.cgi?id=222713

Reviewed by Geoff Garen.

Because NetworkProcess::CreateNetworkConnectionToWebProcess is sent with SendOption::DispatchMessageEvenWhenWaitingForSyncReply, it is possible
for two messages of type NetworkProcess::AddWebsiteDataStore and two messages of type NetworkProcess::CreateNetworkConnectionToWebProcess to be in the queue,
but the second NetworkProcess::CreateNetworkConnectionToWebProcess jumps to the front of the line while the UI process is waiting for the reply to the first.
Then, when calling NetworkProcess::swServerForSession we expect the session's parameters to have been initialized in the network process already, but we cut
ahead of the parameter initialization message.  This is a realistically rare condition that can only be hit when using SPI, but it is hit in the
ResourceLoadStatistics.StoreSuspension API test.  To fix this, we send the WebsiteDataStoreParameters from each WebsiteDataStore in the NetworkProcessCreationParameters.
To avoid doing extra work, we introduce an early return in NetworkProcessProxy::addSession if we have already added parameters from this session to the network process.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::initializeNetworkProcess):
(WebKit::NetworkProcess::addSessionStorageQuotaManager):
* NetworkProcess/NetworkProcessCreationParameters.cpp:
(WebKit::NetworkProcessCreationParameters::encode const):
(WebKit::NetworkProcessCreationParameters::decode):
* NetworkProcess/NetworkProcessCreationParameters.h:
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::sendCreationParametersToNewProcess):
(WebKit::NetworkProcessProxy::addSession):
* UIProcess/Network/NetworkProcessProxy.h:
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::parametersFromEachWebsiteDataStore):
* UIProcess/WebsiteData/WebsiteDataStore.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (274185 => 274186)


--- trunk/Source/WebKit/ChangeLog	2021-03-09 23:59:29 UTC (rev 274185)
+++ trunk/Source/WebKit/ChangeLog	2021-03-10 00:40:08 UTC (rev 274186)
@@ -1,3 +1,33 @@
+2021-03-09  Alex Christensen  <achristen...@webkit.org>
+
+        REGRESSION (r272376): [iOS] ASSERTION FAILED: sessionID.isEphemeral() || !path.isEmpty() in WebKit::NetworkProcess::swServerForSession
+        https://bugs.webkit.org/show_bug.cgi?id=222713
+
+        Reviewed by Geoff Garen.
+
+        Because NetworkProcess::CreateNetworkConnectionToWebProcess is sent with SendOption::DispatchMessageEvenWhenWaitingForSyncReply, it is possible
+        for two messages of type NetworkProcess::AddWebsiteDataStore and two messages of type NetworkProcess::CreateNetworkConnectionToWebProcess to be in the queue,
+        but the second NetworkProcess::CreateNetworkConnectionToWebProcess jumps to the front of the line while the UI process is waiting for the reply to the first.
+        Then, when calling NetworkProcess::swServerForSession we expect the session's parameters to have been initialized in the network process already, but we cut
+        ahead of the parameter initialization message.  This is a realistically rare condition that can only be hit when using SPI, but it is hit in the
+        ResourceLoadStatistics.StoreSuspension API test.  To fix this, we send the WebsiteDataStoreParameters from each WebsiteDataStore in the NetworkProcessCreationParameters.
+        To avoid doing extra work, we introduce an early return in NetworkProcessProxy::addSession if we have already added parameters from this session to the network process.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::initializeNetworkProcess):
+        (WebKit::NetworkProcess::addSessionStorageQuotaManager):
+        * NetworkProcess/NetworkProcessCreationParameters.cpp:
+        (WebKit::NetworkProcessCreationParameters::encode const):
+        (WebKit::NetworkProcessCreationParameters::decode):
+        * NetworkProcess/NetworkProcessCreationParameters.h:
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::sendCreationParametersToNewProcess):
+        (WebKit::NetworkProcessProxy::addSession):
+        * UIProcess/Network/NetworkProcessProxy.h:
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::parametersFromEachWebsiteDataStore):
+        * UIProcess/WebsiteData/WebsiteDataStore.h:
+
 2021-03-09  Chris Dumez  <cdu...@apple.com>
 
         Crash under WebViewImpl::flagsChanged()

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (274185 => 274186)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2021-03-09 23:59:29 UTC (rev 274185)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2021-03-10 00:40:08 UTC (rev 274186)
@@ -353,6 +353,9 @@
     for (auto& scheme : parameters.urlSchemesRegisteredAsNoAccess)
         registerURLSchemeAsNoAccess(scheme);
     
+    for (auto&& websiteDataStoreParameters : WTFMove(parameters.websiteDataStoreParameters))
+        addWebsiteDataStore(WTFMove(websiteDataStoreParameters));
+
     RELEASE_LOG(Process, "%p - NetworkProcess::initializeNetworkProcess: Presenting processPID=%d", this, WebCore::presentingApplicationPID());
 }
 
@@ -430,6 +433,8 @@
     }).isNewEntry;
     if (isNewEntry)
         SandboxExtension::consumePermanently(cacheRootPathHandle);
+    else
+        ASSERT_NOT_REACHED();
 }
 
 void NetworkProcess::removeSessionStorageQuotaManager(PAL::SessionID sessionID)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp (274185 => 274186)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp	2021-03-09 23:59:29 UTC (rev 274185)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp	2021-03-10 00:40:08 UTC (rev 274186)
@@ -28,6 +28,7 @@
 
 #include "ArgumentCoders.h"
 #include "WebCoreArgumentCoders.h"
+#include "WebsiteDataStoreParameters.h"
 
 #if PLATFORM(COCOA)
 #include "ArgumentCodersCF.h"
@@ -36,6 +37,9 @@
 namespace WebKit {
 
 NetworkProcessCreationParameters::NetworkProcessCreationParameters() = default;
+NetworkProcessCreationParameters::~NetworkProcessCreationParameters() = default;
+NetworkProcessCreationParameters::NetworkProcessCreationParameters(NetworkProcessCreationParameters&&) = default;
+NetworkProcessCreationParameters& NetworkProcessCreationParameters::operator=(NetworkProcessCreationParameters&&) = default;
 
 void NetworkProcessCreationParameters::encode(IPC::Encoder& encoder) const
 {
@@ -68,6 +72,7 @@
 
     encoder << enablePrivateClickMeasurement;
     encoder << enablePrivateClickMeasurementDebugMode;
+    encoder << websiteDataStoreParameters;
 }
 
 bool NetworkProcessCreationParameters::decode(IPC::Decoder& decoder, NetworkProcessCreationParameters& result)
@@ -138,6 +143,12 @@
     if (!decoder.decode(result.enablePrivateClickMeasurementDebugMode))
         return false;
 
+    Optional<Vector<WebsiteDataStoreParameters>> websiteDataStoreParameters;
+    decoder >> websiteDataStoreParameters;
+    if (!websiteDataStoreParameters)
+        return false;
+    result.websiteDataStoreParameters = WTFMove(*websiteDataStoreParameters);
+
     return true;
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h (274185 => 274186)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h	2021-03-09 23:59:29 UTC (rev 274185)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h	2021-03-10 00:40:08 UTC (rev 274186)
@@ -43,8 +43,13 @@
 
 namespace WebKit {
 
+struct WebsiteDataStoreParameters;
+
 struct NetworkProcessCreationParameters {
     NetworkProcessCreationParameters();
+    NetworkProcessCreationParameters(NetworkProcessCreationParameters&&);
+    ~NetworkProcessCreationParameters();
+    NetworkProcessCreationParameters& operator=(NetworkProcessCreationParameters&&);
 
     void encode(IPC::Encoder&) const;
     static WARN_UNUSED_RETURN bool decode(IPC::Decoder&, NetworkProcessCreationParameters&);
@@ -82,6 +87,8 @@
 
     bool enablePrivateClickMeasurement { true };
     bool enablePrivateClickMeasurementDebugMode { false };
+
+    Vector<WebsiteDataStoreParameters> websiteDataStoreParameters;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (274185 => 274186)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2021-03-09 23:59:29 UTC (rev 274185)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2021-03-10 00:40:08 UTC (rev 274186)
@@ -158,6 +158,10 @@
         SandboxExtension::createHandle(parentBundleDirectory, SandboxExtension::Type::ReadOnly, parameters.parentBundleDirectoryExtensionHandle);
     SandboxExtension::createHandleForTemporaryFile(emptyString(), SandboxExtension::Type::ReadWrite, parameters.tempDirectoryExtensionHandle);
 #endif
+    parameters.websiteDataStoreParameters = WebsiteDataStore::parametersFromEachWebsiteDataStore();
+    WebsiteDataStore::forEachWebsiteDataStore([this](auto& websiteDataStore) {
+        addSession(websiteDataStore, SendParametersToNetworkProcess::No);
+    });
     WebProcessPool::platformInitializeNetworkProcess(parameters);
     send(Messages::NetworkProcess::InitializeNetworkProcess(parameters), 0);
 }
@@ -1327,11 +1331,13 @@
     sendWithAsyncReply(Messages::NetworkProcess::FlushCookies(sessionID), WTFMove(completionHandler));
 }
 
-void NetworkProcessProxy::addSession(WebsiteDataStore& store)
+void NetworkProcessProxy::addSession(WebsiteDataStore& store, SendParametersToNetworkProcess sendParametersToNetworkProcess)
 {
-    m_websiteDataStores.add(store);
+    auto addResult = m_websiteDataStores.add(store);
+    if (!addResult.isNewEntry)
+        return;
 
-    if (canSendMessage())
+    if (canSendMessage() && sendParametersToNetworkProcess == SendParametersToNetworkProcess::Yes)
         send(Messages::NetworkProcess::AddWebsiteDataStore { store.parameters() }, 0);
     auto sessionID = store.sessionID();
     if (!sessionID.isEphemeral()) {

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (274185 => 274186)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2021-03-09 23:59:29 UTC (rev 274185)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2021-03-10 00:40:08 UTC (rev 274186)
@@ -221,7 +221,8 @@
     void didDestroyWebUserContentControllerProxy(WebUserContentControllerProxy&);
 #endif
 
-    void addSession(WebsiteDataStore&);
+    enum class SendParametersToNetworkProcess : bool { No, Yes };
+    void addSession(WebsiteDataStore&, SendParametersToNetworkProcess);
     void removeSession(WebsiteDataStore&);
     
 #if ENABLE(INDEXED_DATABASE)

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (274185 => 274186)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2021-03-09 23:59:29 UTC (rev 274185)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2021-03-10 00:40:08 UTC (rev 274186)
@@ -208,7 +208,7 @@
 {
     if (!m_networkProcess) {
         m_networkProcess = networkProcessForSession(m_sessionID);
-        m_networkProcess->addSession(*this);
+        m_networkProcess->addSession(*this, NetworkProcessProxy::SendParametersToNetworkProcess::Yes);
     }
 
     return *m_networkProcess;
@@ -1910,6 +1910,15 @@
         processPool->setCacheModelSynchronouslyForTesting(cacheModel);
 }
 
+Vector<WebsiteDataStoreParameters> WebsiteDataStore::parametersFromEachWebsiteDataStore()
+{
+    Vector<WebsiteDataStoreParameters> parameters;
+    parameters.reserveInitialCapacity(allDataStores().size());
+    for (auto* dataStore : allDataStores().values())
+        parameters.uncheckedAppend(dataStore->parameters());
+    return parameters;
+}
+
 WebsiteDataStoreParameters WebsiteDataStore::parameters()
 {
     WebsiteDataStoreParameters parameters;

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h (274185 => 274186)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2021-03-09 23:59:29 UTC (rev 274185)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2021-03-10 00:40:08 UTC (rev 274186)
@@ -258,6 +258,7 @@
     DeviceIdHashSaltStorage& deviceIdHashSaltStorage() { return m_deviceIdHashSaltStorage.get(); }
 
     WebsiteDataStoreParameters parameters();
+    static Vector<WebsiteDataStoreParameters> parametersFromEachWebsiteDataStore();
 
     void flushCookies(CompletionHandler<void()>&&);
     void clearCachedCredentials();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to