Title: [233328] trunk/Source/WebKit
Revision
233328
Author
[email protected]
Date
2018-06-28 14:23:33 -0700 (Thu, 28 Jun 2018)

Log Message

Handle the case of registerMDNSNameCallback called several times
https://bugs.webkit.org/show_bug.cgi?id=187150
<rdar://problem/41329832>

Reviewed by Eric Carlson.

This is a speculative fix on the basis that registerMDNSNameCallback may be called several times.
In that case, we would have freed the context after the first call and would reuse it for the second call.

Instead, keep a map of pending requests and pass to registerMDNSNameCallback an identifier to that map.
If the map has no value for that identifier, return early.

* NetworkProcess/webrtc/NetworkMDNSRegister.cpp:
(WebKit::NetworkMDNSRegister::~NetworkMDNSRegister):
(WebKit::pendingRegistrationRequests):
(WebKit::registerMDNSNameCallback):
(WebKit::NetworkMDNSRegister::clearPendingRequests):
(WebKit::NetworkMDNSRegister::registerMDNSName):
* NetworkProcess/webrtc/NetworkMDNSRegister.h:
(): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (233327 => 233328)


--- trunk/Source/WebKit/ChangeLog	2018-06-28 21:21:41 UTC (rev 233327)
+++ trunk/Source/WebKit/ChangeLog	2018-06-28 21:23:33 UTC (rev 233328)
@@ -1,3 +1,26 @@
+2018-06-28  Youenn Fablet  <[email protected]>
+
+        Handle the case of registerMDNSNameCallback called several times
+        https://bugs.webkit.org/show_bug.cgi?id=187150
+        <rdar://problem/41329832>
+
+        Reviewed by Eric Carlson.
+
+        This is a speculative fix on the basis that registerMDNSNameCallback may be called several times.
+        In that case, we would have freed the context after the first call and would reuse it for the second call.
+
+        Instead, keep a map of pending requests and pass to registerMDNSNameCallback an identifier to that map.
+        If the map has no value for that identifier, return early.
+
+        * NetworkProcess/webrtc/NetworkMDNSRegister.cpp:
+        (WebKit::NetworkMDNSRegister::~NetworkMDNSRegister):
+        (WebKit::pendingRegistrationRequests):
+        (WebKit::registerMDNSNameCallback):
+        (WebKit::NetworkMDNSRegister::clearPendingRequests):
+        (WebKit::NetworkMDNSRegister::registerMDNSName):
+        * NetworkProcess/webrtc/NetworkMDNSRegister.h:
+        (): Deleted.
+
 2018-06-28  Chris Dumez  <[email protected]>
 
         Unreviewed attempt to fix Win Cairo build after r233310.

Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.cpp (233327 => 233328)


--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.cpp	2018-06-28 21:21:41 UTC (rev 233327)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.cpp	2018-06-28 21:23:33 UTC (rev 233328)
@@ -79,9 +79,20 @@
     DNSRecordRef record;
 };
 
+
+static uintptr_t pendingRegistrationRequestCount = 1;
+static HashMap<uintptr_t, std::unique_ptr<PendingRegistrationRequest>>& pendingRegistrationRequests()
+{
+    ASSERT(RunLoop::isMain());
+    static NeverDestroyed<HashMap<uintptr_t, std::unique_ptr<PendingRegistrationRequest>>> map;
+    return map;
+}
+
 static void registerMDNSNameCallback(DNSServiceRef, DNSRecordRef record, DNSServiceFlags, DNSServiceErrorType errorCode, void *context)
 {
-    std::unique_ptr<PendingRegistrationRequest> request { static_cast<PendingRegistrationRequest*>(context) };
+    auto request = pendingRegistrationRequests().take(reinterpret_cast<uintptr_t>(context));
+    if (!request)
+        return;
 
     RELEASE_LOG_IF_ALLOWED_IN_CALLBACK(request->sessionID, "registerMDNSNameCallback with error %d", errorCode);
 
@@ -115,7 +126,7 @@
         service = iterator->value;
 
     String baseName = createCanonicalUUIDString();
-    String name = makeString(baseName, String::number(++m_registrationCount), ".local");
+    String name = makeString(baseName, String::number(pendingRegistrationRequestCount), ".local");
 
     auto ip = inet_addr(ipAddress.utf8().data());
 
@@ -138,13 +149,13 @@
         &ip,
         0,
         registerMDNSNameCallback,
-        pendingRequest.get());
+        reinterpret_cast<void*>(pendingRegistrationRequestCount));
     if (error) {
         RELEASE_LOG_IF_ALLOWED(sessionID, "registerMDNSName DNSServiceRegisterRecord error %d", error);
         m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, makeUnexpected(MDNSRegisterError::DNSSD) }, 0);
         return;
     }
-    pendingRequest.release();
+    pendingRegistrationRequests().add(pendingRegistrationRequestCount++, WTFMove(pendingRequest));
 }
 
 struct PendingResolutionRequest {

Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.h (233327 => 233328)


--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.h	2018-06-28 21:21:41 UTC (rev 233327)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.h	2018-06-28 21:23:33 UTC (rev 233328)
@@ -71,8 +71,6 @@
     NetworkConnectionToWebProcess& m_connection;
 #if ENABLE_MDNS
     HashMap<WebCore::DocumentIdentifier, DNSServiceRef> m_services;
-
-    uint64_t m_registrationCount { 0 };
 #endif
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to