- 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];