Title: [127497] trunk
Revision
127497
Author
[email protected]
Date
2012-09-04 13:34:01 -0700 (Tue, 04 Sep 2012)

Log Message

Regression: Heap-use-after-free in WebCore::FrameView::scrollContentsFastPath
https://bugs.webkit.org/show_bug.cgi?id=95754

Reviewed by Dave Hyatt.

Source/WebCore:

It's possible to have a renderer with position:fixed or sticky style,
but no layer, for example a RenderScrollBarPart. Don't register such
renderers with the FrameView.

Moved the code that registers/unregisters with the FrameView from
styleWillChange() to styleDidChange(), since in the latter case
we can check if we have a RenderLayer. Only register renderers with layers.
We always unregister, which required removing an assertion in
FrameView::removeFixedObject(), and replacing it with a null check of m_fixedObjects.

Test: fast/css/remove-fixed-resizer-crash.html

* page/FrameView.cpp:
(WebCore::FrameView::removeFixedObject):
* rendering/RenderBoxModelObject.cpp:
(WebCore::RenderBoxModelObject::styleWillChange):
(WebCore::RenderBoxModelObject::styleDidChange):

LayoutTests:

Testcase with a position:fixed resizer and scrolling.

* fast/css/remove-fixed-resizer-crash-expected.txt: Added.
* fast/css/remove-fixed-resizer-crash.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (127496 => 127497)


--- trunk/LayoutTests/ChangeLog	2012-09-04 20:30:38 UTC (rev 127496)
+++ trunk/LayoutTests/ChangeLog	2012-09-04 20:34:01 UTC (rev 127497)
@@ -1,3 +1,15 @@
+2012-09-04  Simon Fraser  <[email protected]>
+
+        Regression: Heap-use-after-free in WebCore::FrameView::scrollContentsFastPath
+        https://bugs.webkit.org/show_bug.cgi?id=95754
+
+        Reviewed by Dave Hyatt.
+
+        Testcase with a position:fixed resizer and scrolling.
+
+        * fast/css/remove-fixed-resizer-crash-expected.txt: Added.
+        * fast/css/remove-fixed-resizer-crash.html: Added.
+
 2012-09-04  Roger Fong  <[email protected]>
 
         Unreviewed. Removing accidentally added executable properties on test files.

Added: trunk/LayoutTests/fast/css/remove-fixed-resizer-crash-expected.txt (0 => 127497)


--- trunk/LayoutTests/fast/css/remove-fixed-resizer-crash-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css/remove-fixed-resizer-crash-expected.txt	2012-09-04 20:34:01 UTC (rev 127497)
@@ -0,0 +1,3 @@
+This test should not crash
+
+
Property changes on: trunk/LayoutTests/fast/css/remove-fixed-resizer-crash-expected.txt
___________________________________________________________________

Added: svn:mime-type

Added: svn:keywords

Added: svn:eol-style

Added: trunk/LayoutTests/fast/css/remove-fixed-resizer-crash.html (0 => 127497)


--- trunk/LayoutTests/fast/css/remove-fixed-resizer-crash.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/remove-fixed-resizer-crash.html	2012-09-04 20:34:01 UTC (rev 127497)
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+    body {
+        height: 2000px;
+    }
+    
+    *::-webkit-resizer { position: fixed; }
+</style>
+<script>
+    if (window.testRunner)
+        testRunner.dumpAsText();
+    
+    function doTest()
+    {
+        var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
+        document.body.appendChild(svgElement);
+        window.scrollBy(0, 100);
+    }
+    window.addEventListener('load', doTest, false);
+</script>
+</head>
+<body>
+    <p>This test should not crash</p>
+    <input>
+</body>
+</html>
Property changes on: trunk/LayoutTests/fast/css/remove-fixed-resizer-crash.html
___________________________________________________________________

Added: svn:mime-type

Added: svn:keywords

Added: svn:eol-style

Modified: trunk/Source/WebCore/ChangeLog (127496 => 127497)


--- trunk/Source/WebCore/ChangeLog	2012-09-04 20:30:38 UTC (rev 127496)
+++ trunk/Source/WebCore/ChangeLog	2012-09-04 20:34:01 UTC (rev 127497)
@@ -1,3 +1,28 @@
+2012-09-04  Simon Fraser  <[email protected]>
+
+        Regression: Heap-use-after-free in WebCore::FrameView::scrollContentsFastPath
+        https://bugs.webkit.org/show_bug.cgi?id=95754
+
+        Reviewed by Dave Hyatt.
+
+        It's possible to have a renderer with position:fixed or sticky style,
+        but no layer, for example a RenderScrollBarPart. Don't register such
+        renderers with the FrameView.
+        
+        Moved the code that registers/unregisters with the FrameView from
+        styleWillChange() to styleDidChange(), since in the latter case
+        we can check if we have a RenderLayer. Only register renderers with layers.
+        We always unregister, which required removing an assertion in
+        FrameView::removeFixedObject(), and replacing it with a null check of m_fixedObjects.
+
+        Test: fast/css/remove-fixed-resizer-crash.html
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::removeFixedObject):
+        * rendering/RenderBoxModelObject.cpp:
+        (WebCore::RenderBoxModelObject::styleWillChange):
+        (WebCore::RenderBoxModelObject::styleDidChange):
+
 2012-09-04  Dominik Röttsches  <[email protected]>
 
         ResourceErrorBase needs to identify timeouts

Modified: trunk/Source/WebCore/page/FrameView.cpp (127496 => 127497)


--- trunk/Source/WebCore/page/FrameView.cpp	2012-09-04 20:30:38 UTC (rev 127496)
+++ trunk/Source/WebCore/page/FrameView.cpp	2012-09-04 20:34:01 UTC (rev 127497)
@@ -1440,9 +1440,7 @@
 
 void FrameView::removeFixedObject(RenderObject* object)
 {
-    ASSERT(hasFixedObjects());
-
-    if (m_fixedObjects->contains(object)) {
+    if (m_fixedObjects && m_fixedObjects->contains(object)) {
         m_fixedObjects->remove(object);
         if (Page* page = m_frame->page()) {
             if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())

Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp (127496 => 127497)


--- trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp	2012-09-04 20:30:38 UTC (rev 127496)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp	2012-09-04 20:34:01 UTC (rev 127497)
@@ -418,17 +418,6 @@
         }
     }
 
-    if (FrameView *frameView = view()->frameView()) {
-        bool newStyleIsViewportConstained = newStyle && newStyle->hasViewportConstrainedPosition();
-        bool oldStyleIsViewportConstrained = oldStyle && oldStyle->hasViewportConstrainedPosition();
-        if (newStyleIsViewportConstained != oldStyleIsViewportConstrained) {
-            if (newStyleIsViewportConstained)
-                frameView->addFixedObject(this);
-            else
-                frameView->removeFixedObject(this);
-        }
-    }
-
     RenderObject::styleWillChange(diff, newStyle);
 }
 
@@ -466,6 +455,17 @@
         if (s_hadLayer && layer()->isSelfPaintingLayer() != s_layerWasSelfPainting)
             setChildNeedsLayout(true);
     }
+
+    if (FrameView *frameView = view()->frameView()) {
+        bool newStyleIsViewportConstained = style()->hasViewportConstrainedPosition();
+        bool oldStyleIsViewportConstrained = oldStyle && oldStyle->hasViewportConstrainedPosition();
+        if (newStyleIsViewportConstained != oldStyleIsViewportConstrained) {
+            if (newStyleIsViewportConstained && layer())
+                frameView->addFixedObject(this);
+            else
+                frameView->removeFixedObject(this);
+        }
+    }
 }
 
 void RenderBoxModelObject::updateBoxModelInfoFromStyle()
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to