REGRESSION(r157210): Crashes in WebCore::ScopedEventQueue::dispatchEvent for platform...
authorzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Oct 2013 13:29:54 +0000 (13:29 +0000)
committerzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Oct 2013 13:29:54 +0000 (13:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=122592

Reviewed by Gustavo Noronha Silva.

* dom/ScopedEventQueue.cpp:
(WebCore::ScopedEventQueue::dispatchEvent): When calling EventDispatcher::dispatchEvent(), the GCC-compiled code
first creates a copy of the PassRefPtr<Event> object that's being passed into the method call. The copy will be used
in that method while the original is left with a null pointer. Only after that is the original queried for its pointer
while trying to get the Event's target, resulting in a crash due to calling the Event::target() on a null pointer.
To avoid it, pass a naked Event pointer to the method call. This will create a new PassRefPtr object without nullifying
the original one.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@157219 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/dom/ScopedEventQueue.cpp

index a2e10aa..b293a37 100644 (file)
@@ -1,3 +1,18 @@
+2013-10-10  Zan Dobersek  <zdobersek@igalia.com>
+
+        REGRESSION(r157210): Crashes in WebCore::ScopedEventQueue::dispatchEvent for platforms using GCC
+        https://bugs.webkit.org/show_bug.cgi?id=122592
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * dom/ScopedEventQueue.cpp:
+        (WebCore::ScopedEventQueue::dispatchEvent): When calling EventDispatcher::dispatchEvent(), the GCC-compiled code
+        first creates a copy of the PassRefPtr<Event> object that's being passed into the method call. The copy will be used
+        in that method while the original is left with a null pointer. Only after that is the original queried for its pointer
+        while trying to get the Event's target, resulting in a crash due to calling the Event::target() on a null pointer.
+        To avoid it, pass a naked Event pointer to the method call. This will create a new PassRefPtr object without nullifying
+        the original one.
+
 2013-10-10  Andreas Kling  <akling@apple.com>
 
         Use more Element iterators in SVG code.
index 60055c5..e3dadf1 100644 (file)
@@ -79,7 +79,10 @@ void ScopedEventQueue::dispatchAllEvents()
 void ScopedEventQueue::dispatchEvent(PassRefPtr<Event> event) const
 {
     ASSERT(event->target());
-    EventDispatcher::dispatchEvent(event->target()->toNode(), event);
+    // Passing a naked Event pointer instead of the PassRefPtr<Event> prevents the PassRefPtr copy
+    // that nullifies the original PassRefPtr. This prevents crashes on GCC-compiled code since
+    // GCC creates the copy first, which leaves the event->target() call to be made on a null pointer.
+    EventDispatcher::dispatchEvent(event->target()->toNode(), event.get());
 }
 
 ScopedEventQueue* ScopedEventQueue::instance()