AX: Safari crashed once in WebCore::AccessibilityObject::ariaIsHidden
authorcfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 16 Jun 2014 21:44:16 +0000 (21:44 +0000)
committercfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 16 Jun 2014 21:44:16 +0000 (21:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=133825

Reviewed by Enrica Casucci.

Sometimes asking accessibilityIsIgnored() will cause a newObject to be detached immediately after its created.
The creation function holds a reference with RefPtr as long as it lives, but when that method returns, the object goes away.

With that out of the way, I saw the same backtrace lead to updateLayoutIgnorePendingStylesheets being called while still inLayout.

I tried my best but could not create a reproducible layout test.

* accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::getOrCreate):
* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::updateBackingStore):

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

Source/WebCore/ChangeLog
Source/WebCore/accessibility/AXObjectCache.cpp
Source/WebCore/accessibility/AccessibilityObject.cpp

index 1f23562..83de2e8 100644 (file)
@@ -1,3 +1,22 @@
+2014-06-16  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Safari crashed once in WebCore::AccessibilityObject::ariaIsHidden
+        https://bugs.webkit.org/show_bug.cgi?id=133825
+
+        Reviewed by Enrica Casucci.
+
+        Sometimes asking accessibilityIsIgnored() will cause a newObject to be detached immediately after its created. 
+        The creation function holds a reference with RefPtr as long as it lives, but when that method returns, the object goes away.
+
+        With that out of the way, I saw the same backtrace lead to updateLayoutIgnorePendingStylesheets being called while still inLayout.
+
+        I tried my best but could not create a reproducible layout test.
+
+        * accessibility/AXObjectCache.cpp:
+        (WebCore::AXObjectCache::getOrCreate):
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::updateBackingStore):
+
 2014-06-16  Zan Dobersek  <zdobersek@igalia.com>
 
         Unreviewed. Add more GStreamer-specific header names that are required
index b9a17c3..fa3fd9e 100644 (file)
@@ -431,7 +431,11 @@ AccessibilityObject* AXObjectCache::getOrCreate(RenderObject* renderer)
     newObj->init();
     attachWrapper(newObj.get());
     newObj->setLastKnownIsIgnoredValue(newObj->accessibilityIsIgnored());
-
+    // Sometimes asking accessibilityIsIgnored() will cause the newObject to be deallocated, and then
+    // it will disappear when this function is finished, leading to a use-after-free.
+    if (newObj->isDetached())
+        return nullptr;
+    
     return newObj.get();
 }
     
index f718998..8419bf7 100644 (file)
@@ -1429,8 +1429,10 @@ unsigned AccessibilityObject::doAXLineForIndex(unsigned index)
 void AccessibilityObject::updateBackingStore()
 {
     // Updating the layout may delete this object.
-    if (Document* document = this->document())
-        document->updateLayoutIgnorePendingStylesheets();
+    if (Document* document = this->document()) {
+        if (!document->view()->isInLayout())
+            document->updateLayoutIgnorePendingStylesheets();
+    }
     
     updateChildrenIfNecessary();
 }