Title: [283030] trunk
Revision
283030
Author
[email protected]
Date
2021-09-24 00:22:50 -0700 (Fri, 24 Sep 2021)

Log Message

[RenderTreeUpdater] NULL ptr deref in updateRenderTree
https://bugs.webkit.org/show_bug.cgi?id=230581

Patch by Brandon Stewart <[email protected]> on 2021-09-24
Reviewed by Antti Koivisto.

Source/WebCore:

Text element changes are buffered. This can lead to undesirable behavior
when switching a node to a document that is not rendered, and then proceeding
with a rendering update.

If we cannot find a renderer in a node or its ancestors then just give up
instead of returning a document.

Test: fast/dom/Document/clearPendingRenderTreeUpdater.html

* rendering/updating/RenderTreeUpdater.cpp:
(WebCore::findRenderingRoot):
(WebCore::RenderTreeUpdater::commit):
(WebCore::RenderTreeUpdater::createRenderer):
(WebCore::RenderTreeUpdater::textRendererIsNeeded):

LayoutTests:

New regression test to handle case where we trigger a text update,
and then switch the node to a new unrendered document.

* fast/dom/Document/clearPendingRenderTreeUpdater-expected.txt: Added.
* fast/dom/Document/clearPendingRenderTreeUpdater.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (283029 => 283030)


--- trunk/LayoutTests/ChangeLog	2021-09-24 07:21:59 UTC (rev 283029)
+++ trunk/LayoutTests/ChangeLog	2021-09-24 07:22:50 UTC (rev 283030)
@@ -1,3 +1,16 @@
+2021-09-24  Brandon Stewart  <[email protected]>
+
+        [RenderTreeUpdater] NULL ptr deref in updateRenderTree
+        https://bugs.webkit.org/show_bug.cgi?id=230581
+
+        Reviewed by Antti Koivisto.
+
+        New regression test to handle case where we trigger a text update,
+        and then switch the node to a new unrendered document.
+
+        * fast/dom/Document/clearPendingRenderTreeUpdater-expected.txt: Added.
+        * fast/dom/Document/clearPendingRenderTreeUpdater.html: Added.
+
 2021-09-24  Sihui Liu  <[email protected]>
 
         Add initial support for File System Access API

Added: trunk/LayoutTests/fast/dom/Document/clearPendingRenderTreeUpdater-expected.txt (0 => 283030)


--- trunk/LayoutTests/fast/dom/Document/clearPendingRenderTreeUpdater-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/Document/clearPendingRenderTreeUpdater-expected.txt	2021-09-24 07:22:50 UTC (rev 283030)
@@ -0,0 +1 @@
+This test shall pass if it does not crash.

Added: trunk/LayoutTests/fast/dom/Document/clearPendingRenderTreeUpdater.html (0 => 283030)


--- trunk/LayoutTests/fast/dom/Document/clearPendingRenderTreeUpdater.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/Document/clearPendingRenderTreeUpdater.html	2021-09-24 07:22:50 UTC (rev 283030)
@@ -0,0 +1,22 @@
+<html>
+<body>
+<script>
+    _onload_ = () => {
+        if (window.testRunner)
+          testRunner.dumpAsText()
+
+        let div0 = document.createElement('div');
+        div0.style.display = 'contents';
+        let div1 = document.createElement('div');
+        div1.append('ab');
+        div0.appendChild(div1);
+        document.body.appendChild(div0);
+        document.body.offsetTop;
+        div1.innerHTML = 'a';
+        new Document().appendChild(div0);
+    }
+</script>
+
+This test shall pass if it does not crash.
+</body>
+</html>
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (283029 => 283030)


--- trunk/Source/WebCore/ChangeLog	2021-09-24 07:21:59 UTC (rev 283029)
+++ trunk/Source/WebCore/ChangeLog	2021-09-24 07:22:50 UTC (rev 283030)
@@ -1,3 +1,25 @@
+2021-09-24  Brandon Stewart  <[email protected]>
+
+        [RenderTreeUpdater] NULL ptr deref in updateRenderTree
+        https://bugs.webkit.org/show_bug.cgi?id=230581
+
+        Reviewed by Antti Koivisto.
+
+        Text element changes are buffered. This can lead to undesirable behavior
+        when switching a node to a document that is not rendered, and then proceeding
+        with a rendering update.
+
+        If we cannot find a renderer in a node or its ancestors then just give up
+        instead of returning a document.
+
+        Test: fast/dom/Document/clearPendingRenderTreeUpdater.html
+
+        * rendering/updating/RenderTreeUpdater.cpp:
+        (WebCore::findRenderingRoot):
+        (WebCore::RenderTreeUpdater::commit):
+        (WebCore::RenderTreeUpdater::createRenderer):
+        (WebCore::RenderTreeUpdater::textRendererIsNeeded):
+
 2021-09-24  Sihui Liu  <[email protected]>
 
         Add initial support for File System Access API

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp (283029 => 283030)


--- trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp	2021-09-24 07:21:59 UTC (rev 283029)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp	2021-09-24 07:22:50 UTC (rev 283030)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2021 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -96,7 +96,7 @@
         if (!ancestor.hasDisplayContents())
             return nullptr;
     }
-    return &node.document();
+    return nullptr;
 }
 
 static ListHashSet<ContainerNode*> findRenderingRoots(const Style::Update& update)
@@ -117,7 +117,7 @@
 
     if (!m_document.shouldCreateRenderers() || !m_document.renderView())
         return;
-    
+
     TraceScope scope(RenderTreeBuildStart, RenderTreeBuildEnd);
 
     m_styleUpdate = WTFMove(styleUpdate);
@@ -373,7 +373,7 @@
         renderTreePosition().computeNextSibling(element);
         return renderTreePosition();
     };
-    
+
     if (!shouldCreateRenderer(element, renderTreePosition().parent()))
         return;
 
@@ -443,7 +443,7 @@
     } else {
         if (parentRenderer.isRenderBlock() && !parentRenderer.childrenInline() && (!previousRenderer || !previousRenderer->isInline()))
             return false;
-        
+
         RenderObject* first = parentRenderer.firstChild();
         while (first && first->isFloatingOrOutOfFlowPositioned())
             first = first->nextSibling();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to