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

Changeset 275047 in webkit


Ignore:
Timestamp:
Mar 25, 2021, 10:36:00 AM (5 years ago)
Author:
commit-queue@webkit.org
Message:
REGRESSION (r272376): [iOS] ASSERTION FAILED: sessionID.isEphemeral()
!path.isEmpty() in WebKit::NetworkProcess::swServerForSession

https://bugs.webkit.org/show_bug.cgi?id=222713

Patch by Alex Christensen <achristensen@webkit.org> on 2021-03-25
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

    r275046 r275047  
     12021-03-25  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-25  John Wilander  <wilander@apple.com>
    232
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r275046 r275047  
    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

    r275013 r275047  
    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
     
    6872    encoder << enablePrivateClickMeasurement;
    6973    encoder << enablePrivateClickMeasurementDebugMode;
     74    encoder << websiteDataStoreParameters;
    7075}
    7176
     
    136141        return false;
    137142
     143    Optional<Vector<WebsiteDataStoreParameters>> websiteDataStoreParameters;
     144    decoder >> websiteDataStoreParameters;
     145    if (!websiteDataStoreParameters)
     146        return false;
     147    result.websiteDataStoreParameters = WTFMove(*websiteDataStoreParameters);
     148
    138149    return true;
    139150}
  • trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h

    r275013 r275047  
    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;
     
    8287    bool enablePrivateClickMeasurement { true };
    8388    bool enablePrivateClickMeasurementDebugMode { false };
     89
     90    Vector<WebsiteDataStoreParameters> websiteDataStoreParameters;
    8491};
    8592
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

    r274323 r275047  
    159159    SandboxExtension::createHandleForTemporaryFile(emptyString(), SandboxExtension::Type::ReadWrite, parameters.tempDirectoryExtensionHandle);
    160160#endif
     161
     162#if !PLATFORM(GTK) && !PLATFORM(WPE) // GTK and WPE don't use defaultNetworkProcess
     163    parameters.websiteDataStoreParameters = WebsiteDataStore::parametersFromEachWebsiteDataStore();
     164    WebsiteDataStore::forEachWebsiteDataStore([this](auto& websiteDataStore) {
     165        addSession(websiteDataStore, SendParametersToNetworkProcess::No);
     166    });
     167#endif
     168
    161169    WebProcessPool::platformInitializeNetworkProcess(parameters);
    162170    send(Messages::NetworkProcess::InitializeNetworkProcess(parameters), 0);
     
    13281336}
    13291337
    1330 void NetworkProcessProxy::addSession(WebsiteDataStore& store)
    1331 {
    1332     m_websiteDataStores.add(store);
    1333 
    1334     if (canSendMessage())
     1338void NetworkProcessProxy::addSession(WebsiteDataStore& store, SendParametersToNetworkProcess sendParametersToNetworkProcess)
     1339{
     1340    auto addResult = m_websiteDataStores.add(store);
     1341    if (!addResult.isNewEntry)
     1342        return;
     1343
     1344    if (canSendMessage() && sendParametersToNetworkProcess == SendParametersToNetworkProcess::Yes)
    13351345        send(Messages::NetworkProcess::AddWebsiteDataStore { store.parameters() }, 0);
    13361346    auto sessionID = store.sessionID();
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h

    r274323 r275047  
    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

    r274683 r275047  
    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
     
    19071907}
    19081908
     1909Vector<WebsiteDataStoreParameters> WebsiteDataStore::parametersFromEachWebsiteDataStore()
     1910{
     1911    Vector<WebsiteDataStoreParameters> parameters;
     1912    parameters.reserveInitialCapacity(allDataStores().size());
     1913    for (auto* dataStore : allDataStores().values())
     1914        parameters.uncheckedAppend(dataStore->parameters());
     1915    return parameters;
     1916}
     1917
    19091918WebsiteDataStoreParameters WebsiteDataStore::parameters()
    19101919{
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h

    r274323 r275047  
    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.