Title: [252141] trunk/Source/WebKit
Revision
252141
Author
cdu...@apple.com
Date
2019-11-06 12:14:11 -0800 (Wed, 06 Nov 2019)

Log Message

Make sure we never end up with NetworkDataTaskCocoa TaskIdentifier conflicts
https://bugs.webkit.org/show_bug.cgi?id=203902

Reviewed by Antti Koivisto.

Consolidate the all the code related to data task registration / lookup / unregistration
in NetworkSessionCocoa and add a utility method (dataTaskMap()) to decide which data
task map to use. This makes it less error-prone and unlikely that someone would update
part of the code and fail to update the rest accordingly.

I also converted the debug assertions into release ones so that we crash in case of
id confusion instead of having a very bad and hard to diagnose bug like Bug 201822.

* NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
* NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
(WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):
(WebKit::NetworkDataTaskCocoa::~NetworkDataTaskCocoa):
* NetworkProcess/cocoa/NetworkSessionCocoa.h:
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(WebKit::NetworkSessionCocoa::dataTaskForIdentifier):
(WebKit::NetworkSessionCocoa::registerDataTask):
(WebKit::NetworkSessionCocoa::unregisterDataTask):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (252140 => 252141)


--- trunk/Source/WebKit/ChangeLog	2019-11-06 17:37:48 UTC (rev 252140)
+++ trunk/Source/WebKit/ChangeLog	2019-11-06 20:14:11 UTC (rev 252141)
@@ -1,3 +1,28 @@
+2019-11-06  Chris Dumez  <cdu...@apple.com>
+
+        Make sure we never end up with NetworkDataTaskCocoa TaskIdentifier conflicts
+        https://bugs.webkit.org/show_bug.cgi?id=203902
+
+        Reviewed by Antti Koivisto.
+
+        Consolidate the all the code related to data task registration / lookup / unregistration
+        in NetworkSessionCocoa and add a utility method (dataTaskMap()) to decide which data
+        task map to use. This makes it less error-prone and unlikely that someone would update
+        part of the code and fail to update the rest accordingly.
+
+        I also converted the debug assertions into release ones so that we crash in case of
+        id confusion instead of having a very bad and hard to diagnose bug like Bug 201822.
+
+        * NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
+        * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
+        (WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):
+        (WebKit::NetworkDataTaskCocoa::~NetworkDataTaskCocoa):
+        * NetworkProcess/cocoa/NetworkSessionCocoa.h:
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+        (WebKit::NetworkSessionCocoa::dataTaskForIdentifier):
+        (WebKit::NetworkSessionCocoa::registerDataTask):
+        (WebKit::NetworkSessionCocoa::unregisterDataTask):
+
 2019-11-06  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK] Implement support for Pointer Lock API

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h (252140 => 252141)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h	2019-11-06 17:37:48 UTC (rev 252140)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h	2019-11-06 20:14:11 UTC (rev 252141)
@@ -49,7 +49,7 @@
 
     ~NetworkDataTaskCocoa();
 
-    typedef uint64_t TaskIdentifier;
+    using TaskIdentifier = uint64_t;
 
     void didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend);
     void didReceiveChallenge(WebCore::AuthenticationChallenge&&, ChallengeCompletionHandler&&);

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm (252140 => 252141)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm	2019-11-06 17:37:48 UTC (rev 252140)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm	2019-11-06 20:14:11 UTC (rev 252141)
@@ -226,24 +226,10 @@
         m_task = [cocoaSession.isolatedSession(storedCredentialsPolicy, firstParty) dataTaskWithRequest:nsRequest];
     else
         m_task = [cocoaSession.session(storedCredentialsPolicy) dataTaskWithRequest:nsRequest];
-    switch (storedCredentialsPolicy) {
-    case WebCore::StoredCredentialsPolicy::Use:
-        ASSERT(!cocoaSession.m_dataTaskMapWithCredentials.contains([m_task taskIdentifier]));
-        cocoaSession.m_dataTaskMapWithCredentials.add([m_task taskIdentifier], this);
-        LOG(NetworkSession, "%llu Creating stateful NetworkDataTask with URL %s", [m_task taskIdentifier], nsRequest.URL.absoluteString.UTF8String);
-        break;
-    case WebCore::StoredCredentialsPolicy::DoNotUse:
-        ASSERT(!cocoaSession.m_dataTaskMapWithoutState.contains([m_task taskIdentifier]));
-        cocoaSession.m_dataTaskMapWithoutState.add([m_task taskIdentifier], this);
-        LOG(NetworkSession, "%llu Creating stateless NetworkDataTask with URL %s", [m_task taskIdentifier], nsRequest.URL.absoluteString.UTF8String);
-        break;
-    case WebCore::StoredCredentialsPolicy::EphemeralStatelessCookieless:
-        ASSERT(!cocoaSession.m_dataTaskMapEphemeralStatelessCookieless.contains([m_task taskIdentifier]));
-        cocoaSession.m_dataTaskMapEphemeralStatelessCookieless.add([m_task taskIdentifier], this);
-        LOG(NetworkSession, "%llu Creating ephemeral, stateless, cookieless NetworkDataTask with URL %s", [m_task taskIdentifier], nsRequest.URL.absoluteString.UTF8String);
-        break;
-    }
 
+    LOG(NetworkSession, "%llu Creating NetworkDataTask with storedCredentialsPolicy=%u and URL="" [m_task taskIdentifier], storedCredentialsPolicy, nsRequest.URL.absoluteString.UTF8String);
+    cocoaSession.registerDataTask([m_task taskIdentifier], *this, storedCredentialsPolicy);
+
     if (shouldPreconnectOnly == PreconnectOnly::Yes) {
 #if ENABLE(SERVER_PRECONNECT)
         m_task.get()._preconnect = true;
@@ -281,20 +267,7 @@
         return;
 
     auto& cocoaSession = static_cast<NetworkSessionCocoa&>(*m_session);
-    switch (m_storedCredentialsPolicy) {
-    case WebCore::StoredCredentialsPolicy::Use:
-        ASSERT(cocoaSession.m_dataTaskMapWithCredentials.get([m_task taskIdentifier]) == this);
-        cocoaSession.m_dataTaskMapWithCredentials.remove([m_task taskIdentifier]);
-        break;
-    case WebCore::StoredCredentialsPolicy::DoNotUse:
-        ASSERT(cocoaSession.m_dataTaskMapWithoutState.get([m_task taskIdentifier]) == this);
-        cocoaSession.m_dataTaskMapWithoutState.remove([m_task taskIdentifier]);
-        break;
-    case WebCore::StoredCredentialsPolicy::EphemeralStatelessCookieless:
-        ASSERT(cocoaSession.m_dataTaskMapEphemeralStatelessCookieless.get([m_task taskIdentifier]) == this);
-        cocoaSession.m_dataTaskMapEphemeralStatelessCookieless.remove([m_task taskIdentifier]);
-        break;
-    }
+    cocoaSession.unregisterDataTask([m_task taskIdentifier], *this, m_storedCredentialsPolicy);
 }
 
 void NetworkDataTaskCocoa::restrictRequestReferrerToOriginIfNeeded(WebCore::ResourceRequest& request)

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.h (252140 => 252141)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.h	2019-11-06 17:37:48 UTC (rev 252140)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.h	2019-11-06 20:14:11 UTC (rev 252141)
@@ -64,6 +64,9 @@
 #endif
 
     NetworkDataTaskCocoa* dataTaskForIdentifier(NetworkDataTaskCocoa::TaskIdentifier, WebCore::StoredCredentialsPolicy);
+    void registerDataTask(NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa&, WebCore::StoredCredentialsPolicy);
+    void unregisterDataTask(NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa&, WebCore::StoredCredentialsPolicy);
+
     NSURLSessionDownloadTask* downloadTaskWithResumeData(NSData*);
 
     WebSocketTask* webSocketDataTaskForIdentifier(WebSocketTask::TaskIdentifier);
@@ -100,6 +103,8 @@
     void removeWebSocketTask(WebSocketTask&) final;
 #endif
 
+    HashMap<NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa*>& dataTaskMap(WebCore::StoredCredentialsPolicy);
+
     HashMap<NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa*> m_dataTaskMapWithCredentials;
     HashMap<NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa*> m_dataTaskMapWithoutState;
     HashMap<NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa*> m_dataTaskMapEphemeralStatelessCookieless;

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm (252140 => 252141)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm	2019-11-06 17:37:48 UTC (rev 252140)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm	2019-11-06 20:14:11 UTC (rev 252141)
@@ -1220,14 +1220,41 @@
 #endif
 }
 
+HashMap<NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa*>& NetworkSessionCocoa::dataTaskMap(WebCore::StoredCredentialsPolicy storedCredentialsPolicy)
+{
+    ASSERT(RunLoop::isMain());
+    switch (storedCredentialsPolicy) {
+    case WebCore::StoredCredentialsPolicy::EphemeralStatelessCookieless:
+        return m_dataTaskMapEphemeralStatelessCookieless;
+    case WebCore::StoredCredentialsPolicy::DoNotUse:
+        return m_dataTaskMapWithoutState;
+    case WebCore::StoredCredentialsPolicy::Use:
+        return m_dataTaskMapWithCredentials;
+    }
+    ASSERT_NOT_REACHED();
+    return m_dataTaskMapWithCredentials;
+}
+
 NetworkDataTaskCocoa* NetworkSessionCocoa::dataTaskForIdentifier(NetworkDataTaskCocoa::TaskIdentifier taskIdentifier, WebCore::StoredCredentialsPolicy storedCredentialsPolicy)
 {
     ASSERT(RunLoop::isMain());
-    if (storedCredentialsPolicy == WebCore::StoredCredentialsPolicy::Use)
-        return m_dataTaskMapWithCredentials.get(taskIdentifier);
-    return m_dataTaskMapWithoutState.get(taskIdentifier);
+    return dataTaskMap(storedCredentialsPolicy).get(taskIdentifier);
 }
 
+void NetworkSessionCocoa::registerDataTask(NetworkDataTaskCocoa::TaskIdentifier taskIdentifier, NetworkDataTaskCocoa& dataTask, WebCore::StoredCredentialsPolicy storedCredentialsPolicy)
+{
+    auto& map = dataTaskMap(storedCredentialsPolicy);
+    RELEASE_ASSERT(!map.contains(taskIdentifier));
+    map.add(taskIdentifier, &dataTask);
+}
+
+void NetworkSessionCocoa::unregisterDataTask(NetworkDataTaskCocoa::TaskIdentifier taskIdentifier, NetworkDataTaskCocoa& dataTask, WebCore::StoredCredentialsPolicy storedCredentialsPolicy)
+{
+    auto& map = dataTaskMap(storedCredentialsPolicy);
+    RELEASE_ASSERT(map.get(taskIdentifier) == &dataTask);
+    map.remove(taskIdentifier);
+}
+
 NSURLSessionDownloadTask* NetworkSessionCocoa::downloadTaskWithResumeData(NSData* resumeData)
 {
     return [m_sessionWithCredentialStorage downloadTaskWithResumeData:resumeData];
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to