⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 274186 in webkit


Ignore:
Timestamp:
Mar 9, 2021, 4:40:08 PM (6 years ago)
Author:
achristensen@apple.com
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:
Location:
trunk/Source/WebKit
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r274176 r274186  
     12021-03-09  Alex Christensen  <achristensen@webkit.org>
     2
     3        REGRESSION (r272376): [iOS] ASSERTION FAILED: sessionID.isEphemeral() || !path.isEmpty() in WebKit::NetworkProcess::swServerForSession
     4        https://bugs.webkit.org/show_bug.cgi?id=222713
     5
     6        Reviewed by Geoff Garen.
     7
     8        Because NetworkProcess::CreateNetworkConnectionToWebProcess is sent with SendOption::DispatchMessageEvenWhenWaitingForSyncReply, it is possible
     9        for two messages of type NetworkProcess::AddWebsiteDataStore and two messages of type NetworkProcess::CreateNetworkConnectionToWebProcess to be in the queue,
     10        but the second NetworkProcess::CreateNetworkConnectionToWebProcess jumps to the front of the line while the UI process is waiting for the reply to the first.
     11        Then, when calling NetworkProcess::swServerForSession we expect the session's parameters to have been initialized in the network process already, but we cut
     12        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
     13        ResourceLoadStatistics.StoreSuspension API test.  To fix this, we send the WebsiteDataStoreParameters from each WebsiteDataStore in the NetworkProcessCreationParameters.
     14        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.
     15
     16        * NetworkProcess/NetworkProcess.cpp:
     17        (WebKit::NetworkProcess::initializeNetworkProcess):
     18        (WebKit::NetworkProcess::addSessionStorageQuotaManager):
     19        * NetworkProcess/NetworkProcessCreationParameters.cpp:
     20        (WebKit::NetworkProcessCreationParameters::encode const):
     21        (WebKit::NetworkProcessCreationParameters::decode):
     22        * NetworkProcess/NetworkProcessCreationParameters.h:
     23        * UIProcess/Network/NetworkProcessProxy.cpp:
     24        (WebKit::NetworkProcessProxy::sendCreationParametersToNewProcess):
     25        (WebKit::NetworkProcessProxy::addSession):
     26        * UIProcess/Network/NetworkProcessProxy.h:
     27        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
     28        (WebKit::WebsiteDataStore::parametersFromEachWebsiteDataStore):
     29        * UIProcess/WebsiteData/WebsiteDataStore.h:
     30
    1312021-03-09  Chris Dumez  <cdumez@apple.com>
    232
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r274174 r274186  
    354354        registerURLSchemeAsNoAccess(scheme);
    355355   
     356    for (auto&& websiteDataStoreParameters : WTFMove(parameters.websiteDataStoreParameters))
     357        addWebsiteDataStore(WTFMove(websiteDataStoreParameters));
     358
    356359    RELEASE_LOG(Process, "%p - NetworkProcess::initializeNetworkProcess: Presenting processPID=%d", this, WebCore::presentingApplicationPID());
    357360}
     
    431434    if (isNewEntry)
    432435        SandboxExtension::consumePermanently(cacheRootPathHandle);
     436    else
     437        ASSERT_NOT_REACHED();
    433438}
    434439
  • trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp

    r271537 r274186  
    2929#include "ArgumentCoders.h"
    3030#include "WebCoreArgumentCoders.h"
     31#include "WebsiteDataStoreParameters.h"
    3132
    3233#if PLATFORM(COCOA)
     
    3738
    3839NetworkProcessCreationParameters::NetworkProcessCreationParameters() = default;
     40NetworkProcessCreationParameters::~NetworkProcessCreationParameters() = default;
     41NetworkProcessCreationParameters::NetworkProcessCreationParameters(NetworkProcessCreationParameters&&) = default;
     42NetworkProcessCreationParameters& NetworkProcessCreationParameters::operator=(NetworkProcessCreationParameters&&) = default;
    3943
    4044void NetworkProcessCreationParameters::encode(IPC::Encoder& encoder) const
     
    6973    encoder << enablePrivateClickMeasurement;
    7074    encoder << enablePrivateClickMeasurementDebugMode;
     75    encoder << websiteDataStoreParameters;
    7176}
    7277
     
    139144        return false;
    140145
     146    Optional<Vector<WebsiteDataStoreParameters>> websiteDataStoreParameters;
     147    decoder >> websiteDataStoreParameters;
     148    if (!websiteDataStoreParameters)
     149        return false;
     150    result.websiteDataStoreParameters = WTFMove(*websiteDataStoreParameters);
     151
    141152    return true;
    142153}
  • trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h

    r271537 r274186  
    4444namespace WebKit {
    4545
     46struct WebsiteDataStoreParameters;
     47
    4648struct NetworkProcessCreationParameters {
    4749    NetworkProcessCreationParameters();
     50    NetworkProcessCreationParameters(NetworkProcessCreationParameters&&);
     51    ~NetworkProcessCreationParameters();
     52    NetworkProcessCreationParameters& operator=(NetworkProcessCreationParameters&&);
    4853
    4954    void encode(IPC::Encoder&) const;
     
    8388    bool enablePrivateClickMeasurement { true };
    8489    bool enablePrivateClickMeasurementDebugMode { false };
     90
     91    Vector<WebsiteDataStoreParameters> websiteDataStoreParameters;
    8592};
    8693
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

    r273941 r274186  
    159159    SandboxExtension::createHandleForTemporaryFile(emptyString(), SandboxExtension::Type::ReadWrite, parameters.tempDirectoryExtensionHandle);
    160160#endif
     161    parameters.websiteDataStoreParameters = WebsiteDataStore::parametersFromEachWebsiteDataStore();
     162    WebsiteDataStore::forEachWebsiteDataStore([this](auto& websiteDataStore) {
     163        addSession(websiteDataStore, SendParametersToNetworkProcess::No);
     164    });
    161165    WebProcessPool::platformInitializeNetworkProcess(parameters);
    162166    send(Messages::NetworkProcess::InitializeNetworkProcess(parameters), 0);
     
    13281332}
    13291333
    1330 void NetworkProcessProxy::addSession(WebsiteDataStore& store)
    1331 {
    1332     m_websiteDataStores.add(store);
    1333 
    1334     if (canSendMessage())
     1334void NetworkProcessProxy::addSession(WebsiteDataStore& store, SendParametersToNetworkProcess sendParametersToNetworkProcess)
     1335{
     1336    auto addResult = m_websiteDataStores.add(store);
     1337    if (!addResult.isNewEntry)
     1338        return;
     1339
     1340    if (canSendMessage() && sendParametersToNetworkProcess == SendParametersToNetworkProcess::Yes)
    13351341        send(Messages::NetworkProcess::AddWebsiteDataStore { store.parameters() }, 0);
    13361342    auto sessionID = store.sessionID();
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h

    r274172 r274186  
    222222#endif
    223223
    224     void addSession(WebsiteDataStore&);
     224    enum class SendParametersToNetworkProcess : bool { No, Yes };
     225    void addSession(WebsiteDataStore&, SendParametersToNetworkProcess);
    225226    void removeSession(WebsiteDataStore&);
    226227   
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp

    r274130 r274186  
    209209    if (!m_networkProcess) {
    210210        m_networkProcess = networkProcessForSession(m_sessionID);
    211         m_networkProcess->addSession(*this);
     211        m_networkProcess->addSession(*this, NetworkProcessProxy::SendParametersToNetworkProcess::Yes);
    212212    }
    213213
     
    19111911}
    19121912
     1913Vector<WebsiteDataStoreParameters> WebsiteDataStore::parametersFromEachWebsiteDataStore()
     1914{
     1915    Vector<WebsiteDataStoreParameters> parameters;
     1916    parameters.reserveInitialCapacity(allDataStores().size());
     1917    for (auto* dataStore : allDataStores().values())
     1918        parameters.uncheckedAppend(dataStore->parameters());
     1919    return parameters;
     1920}
     1921
    19131922WebsiteDataStoreParameters WebsiteDataStore::parameters()
    19141923{
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h

    r273941 r274186  
    259259
    260260    WebsiteDataStoreParameters parameters();
     261    static Vector<WebsiteDataStoreParameters> parametersFromEachWebsiteDataStore();
    261262
    262263    void flushCookies(CompletionHandler<void()>&&);
Note: See TracChangeset for help on using the changeset viewer.