Title: [233493] trunk/Source/WebCore
Revision
233493
Author
[email protected]
Date
2018-07-03 19:33:07 -0700 (Tue, 03 Jul 2018)

Log Message

Add a release assert to diagnose infinite recursions in removeAllEventListeners()
https://bugs.webkit.org/show_bug.cgi?id=187287

Reviewed by Keith Miller.

Assert that we never re-enter removeAllEventListeners per thread.

* dom/EventTarget.cpp:
(WebCore::EventTarget::removeAllEventListeners):
* platform/ThreadGlobalData.h:
(WebCore::ThreadGlobalData::ThreadGlobalData::isInRemoveAllEventListeners const):
(WebCore::ThreadGlobalData::ThreadGlobalData::setIsInRemoveAllEventListeners):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (233492 => 233493)


--- trunk/Source/WebCore/ChangeLog	2018-07-04 01:56:08 UTC (rev 233492)
+++ trunk/Source/WebCore/ChangeLog	2018-07-04 02:33:07 UTC (rev 233493)
@@ -1,3 +1,18 @@
+2018-07-03  Ryosuke Niwa  <[email protected]>
+
+        Add a release assert to diagnose infinite recursions in removeAllEventListeners()
+        https://bugs.webkit.org/show_bug.cgi?id=187287
+
+        Reviewed by Keith Miller.
+
+        Assert that we never re-enter removeAllEventListeners per thread.
+
+        * dom/EventTarget.cpp:
+        (WebCore::EventTarget::removeAllEventListeners):
+        * platform/ThreadGlobalData.h:
+        (WebCore::ThreadGlobalData::ThreadGlobalData::isInRemoveAllEventListeners const):
+        (WebCore::ThreadGlobalData::ThreadGlobalData::setIsInRemoveAllEventListeners):
+
 2018-07-03  Chris Dumez  <[email protected]>
 
         performance-api/performance-observer-no-document-leak.html is flaky

Modified: trunk/Source/WebCore/dom/EventTarget.cpp (233492 => 233493)


--- trunk/Source/WebCore/dom/EventTarget.cpp	2018-07-04 01:56:08 UTC (rev 233492)
+++ trunk/Source/WebCore/dom/EventTarget.cpp	2018-07-04 02:33:07 UTC (rev 233493)
@@ -310,10 +310,16 @@
 
 void EventTarget::removeAllEventListeners()
 {
+    auto& threadData = threadGlobalData();
+    RELEASE_ASSERT(!threadData.isInRemoveAllEventListeners());
+
+    threadData.setIsInRemoveAllEventListeners(true);
+
     auto* data = ""
-    if (!data)
-        return;
-    data->eventListenerMap.clear();
+    if (data)
+        data->eventListenerMap.clear();
+
+    threadData.setIsInRemoveAllEventListeners(false);
 }
 
 void EventTarget::visitJSEventListeners(JSC::SlotVisitor& visitor)

Modified: trunk/Source/WebCore/platform/ThreadGlobalData.h (233492 => 233493)


--- trunk/Source/WebCore/platform/ThreadGlobalData.h	2018-07-04 01:56:08 UTC (rev 233492)
+++ trunk/Source/WebCore/platform/ThreadGlobalData.h	2018-07-04 02:33:07 UTC (rev 233493)
@@ -62,6 +62,9 @@
         void setWebCoreThreadData();
 #endif
 
+        bool isInRemoveAllEventListeners() const { return m_isInRemoveAllEventListeners; }
+        void setIsInRemoveAllEventListeners(bool value) { m_isInRemoveAllEventListeners = value; }
+
     private:
         std::unique_ptr<CachedResourceRequestInitiators> m_cachedResourceRequestInitiators;
         std::unique_ptr<EventNames> m_eventNames;
@@ -72,6 +75,8 @@
         bool m_isMainThread;
 #endif
 
+        bool m_isInRemoveAllEventListeners { false };
+
         std::unique_ptr<ICUConverterWrapper> m_cachedConverterICU;
 
         WEBCORE_EXPORT friend ThreadGlobalData& threadGlobalData();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to