Title: [289190] releases/WebKitGTK/webkit-2.34
Revision
289190
Author
[email protected]
Date
2022-02-06 16:38:37 -0800 (Sun, 06 Feb 2022)

Log Message

Merge r289060 - null ptr deref in RenderTreeBuilder::Block::attachIgnoringContinuation
https://bugs.webkit.org/show_bug.cgi?id=234170

Patch by Frédéric Wang <[email protected]> on 2022-02-03
Reviewed by Antti Koivisto.

Source/WebCore:

When an element with "display: contents" is put into the top layer, its computed style for
the display property becomes "block" [1]. However, RenderTreeUpdater::updateElementRenderer
does not manage well this transition. In particular, a null ptr deref happens for some
special configuration involving a <dialog style="display: contents">. To work around that
issue, always force tearing down renderers when updating an element in the top layer.

[1] https://fullscreen.spec.whatwg.org/#new-stacking-layer

Test: fast/layers/top-layer-display-contents-crash.html

* rendering/updating/RenderTreeUpdater.cpp:
(WebCore::RenderTreeUpdater::updateElementRenderer): Always force tearing down renderers
for top layer element.

LayoutTests:

Add regression test.

* fast/css/top-layer-display-contents-crash-expected.txt: Added.
* fast/css/top-layer-display-contents-crash.html: Added.

Modified Paths

Added Paths

Diff

Modified: releases/WebKitGTK/webkit-2.34/LayoutTests/ChangeLog (289189 => 289190)


--- releases/WebKitGTK/webkit-2.34/LayoutTests/ChangeLog	2022-02-07 00:33:13 UTC (rev 289189)
+++ releases/WebKitGTK/webkit-2.34/LayoutTests/ChangeLog	2022-02-07 00:38:37 UTC (rev 289190)
@@ -1,3 +1,15 @@
+2022-02-03  Frédéric Wang  <[email protected]>
+
+        null ptr deref in RenderTreeBuilder::Block::attachIgnoringContinuation
+        https://bugs.webkit.org/show_bug.cgi?id=234170
+
+        Reviewed by Antti Koivisto.
+
+        Add regression test.
+
+        * fast/css/top-layer-display-contents-crash-expected.txt: Added.
+        * fast/css/top-layer-display-contents-crash.html: Added.
+
 2022-01-27  Gabriel Nava Marino  <[email protected]>
 
         jsc_fuz/wktr: crash with new XRReferenceSpaceEvent('', {referenceSpace})

Added: releases/WebKitGTK/webkit-2.34/LayoutTests/fast/css/top-layer-display-contents-crash-expected.txt (0 => 289190)


--- releases/WebKitGTK/webkit-2.34/LayoutTests/fast/css/top-layer-display-contents-crash-expected.txt	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.34/LayoutTests/fast/css/top-layer-display-contents-crash-expected.txt	2022-02-07 00:38:37 UTC (rev 289190)
@@ -0,0 +1,3 @@
+This test PASS if it does not CRASH.
+
+TEXT_CHILD

Added: releases/WebKitGTK/webkit-2.34/LayoutTests/fast/css/top-layer-display-contents-crash.html (0 => 289190)


--- releases/WebKitGTK/webkit-2.34/LayoutTests/fast/css/top-layer-display-contents-crash.html	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.34/LayoutTests/fast/css/top-layer-display-contents-crash.html	2022-02-07 00:38:37 UTC (rev 289190)
@@ -0,0 +1,18 @@
+<script>
+  if (testRunner) {
+    testRunner.waitUntilDone();
+    testRunner.dumpAsText();
+  }
+  _onload_ = () => {
+    var frame = document.createElement("frame");
+    document.body.appendChild(frame);
+    iframe.appendChild(frame);
+    requestAnimationFrame(() => {
+	dialog.showModal();
+	if (testRunner)
+          testRunner.notifyDone();
+    });
+  };
+</script>
+<p>This test PASS if it does not CRASH.</p>
+<dialog id="dialog" style="display: contents"><iframe id="iframe"><frame/></iframe>TEXT_CHILD</dialog>

Modified: releases/WebKitGTK/webkit-2.34/Source/WebCore/ChangeLog (289189 => 289190)


--- releases/WebKitGTK/webkit-2.34/Source/WebCore/ChangeLog	2022-02-07 00:33:13 UTC (rev 289189)
+++ releases/WebKitGTK/webkit-2.34/Source/WebCore/ChangeLog	2022-02-07 00:38:37 UTC (rev 289190)
@@ -1,3 +1,24 @@
+2022-02-03  Frédéric Wang  <[email protected]>
+
+        null ptr deref in RenderTreeBuilder::Block::attachIgnoringContinuation
+        https://bugs.webkit.org/show_bug.cgi?id=234170
+
+        Reviewed by Antti Koivisto.
+
+        When an element with "display: contents" is put into the top layer, its computed style for
+        the display property becomes "block" [1]. However, RenderTreeUpdater::updateElementRenderer
+        does not manage well this transition. In particular, a null ptr deref happens for some
+        special configuration involving a <dialog style="display: contents">. To work around that
+        issue, always force tearing down renderers when updating an element in the top layer.
+
+        [1] https://fullscreen.spec.whatwg.org/#new-stacking-layer
+
+        Test: fast/layers/top-layer-display-contents-crash.html
+
+        * rendering/updating/RenderTreeUpdater.cpp:
+        (WebCore::RenderTreeUpdater::updateElementRenderer): Always force tearing down renderers
+        for top layer element.
+
 2022-02-01  Andres Gonzalez  <[email protected]>
 
         Check AccessibilityRenderObject::m_renderer for null before using it.

Modified: releases/WebKitGTK/webkit-2.34/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp (289189 => 289190)


--- releases/WebKitGTK/webkit-2.34/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp	2022-02-07 00:33:13 UTC (rev 289189)
+++ releases/WebKitGTK/webkit-2.34/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp	2022-02-07 00:38:37 UTC (rev 289190)
@@ -317,7 +317,7 @@
         elementUpdateStyle->addCachedPseudoStyle(RenderStyle::clonePtr(*it.value.style));
     }
 
-    bool shouldTearDownRenderers = elementUpdate.change == Style::Change::Renderer && (element.renderer() || element.hasDisplayContents());
+    bool shouldTearDownRenderers = elementUpdate.change == Style::Change::Renderer && (element.renderer() || element.hasDisplayContents() || element.isInTopLayer());
     if (shouldTearDownRenderers) {
         if (!element.renderer()) {
             // We may be tearing down a descendant renderer cached in renderTreePosition.
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to