Title: [249026] trunk
Revision
249026
Author
s...@apple.com
Date
2019-08-22 14:13:38 -0700 (Thu, 22 Aug 2019)

Log Message

Crash may happen when an SVG <feImage> element references the root <svg> element
https://bugs.webkit.org/show_bug.cgi?id=201014

Reviewed by Ryosuke Niwa.

Source/WebCore:

When an <feImage> references an <svg> element as its target image but
this <svg> element is also one of the ancestors of the <feImage>, the
parent <filter> should not be applied.

Test: svg/filters/filter-image-ref-root.html

* svg/SVGFEImageElement.cpp:
(WebCore::SVGFEImageElement::build const):

LayoutTests:

Ensure the cyclic reference between the <feImage> renderer and its
ancestor <svg> root renderer is broken.

* svg/filters/filter-image-ref-root-expected.txt: Added.
* svg/filters/filter-image-ref-root.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (249025 => 249026)


--- trunk/LayoutTests/ChangeLog	2019-08-22 19:25:48 UTC (rev 249025)
+++ trunk/LayoutTests/ChangeLog	2019-08-22 21:13:38 UTC (rev 249026)
@@ -1,3 +1,16 @@
+2019-08-22  Said Abou-Hallawa  <sabouhall...@apple.com>
+
+        Crash may happen when an SVG <feImage> element references the root <svg> element
+        https://bugs.webkit.org/show_bug.cgi?id=201014
+
+        Reviewed by Ryosuke Niwa.
+
+        Ensure the cyclic reference between the <feImage> renderer and its
+        ancestor <svg> root renderer is broken.
+
+        * svg/filters/filter-image-ref-root-expected.txt: Added.
+        * svg/filters/filter-image-ref-root.html: Added.
+
 2019-08-22  Tim Horton  <timothy_hor...@apple.com>
 
         Rebaseline some editing tests after r248974

Added: trunk/LayoutTests/svg/filters/filter-image-ref-root-expected.txt (0 => 249026)


--- trunk/LayoutTests/svg/filters/filter-image-ref-root-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/svg/filters/filter-image-ref-root-expected.txt	2019-08-22 21:13:38 UTC (rev 249026)
@@ -0,0 +1,2 @@
+This test passes if it does not crash.
+

Added: trunk/LayoutTests/svg/filters/filter-image-ref-root.html (0 => 249026)


--- trunk/LayoutTests/svg/filters/filter-image-ref-root.html	                        (rev 0)
+++ trunk/LayoutTests/svg/filters/filter-image-ref-root.html	2019-08-22 21:13:38 UTC (rev 249026)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<style>
+    ::selection {
+        background-color: lime;
+    }
+</style>
+<body>
+    <svg id="svgx" filter="url(#filter)">
+        <filter id="filter">
+            <feImage xlink:href=""
+        </filter>
+        <text id="text">This test passes if it does not crash.</text>
+    </svg>
+    <script>
+        if (window.testRunner)
+            testRunner.dumpAsText(true);
+        window.addEventListener('load', (event) => {
+            document.getSelection().setBaseAndExtent(text, 0, text, 1);
+        });
+    </script>
+</body>

Modified: trunk/Source/WebCore/ChangeLog (249025 => 249026)


--- trunk/Source/WebCore/ChangeLog	2019-08-22 19:25:48 UTC (rev 249025)
+++ trunk/Source/WebCore/ChangeLog	2019-08-22 21:13:38 UTC (rev 249026)
@@ -1,3 +1,19 @@
+2019-08-22  Said Abou-Hallawa  <sabouhall...@apple.com>
+
+        Crash may happen when an SVG <feImage> element references the root <svg> element
+        https://bugs.webkit.org/show_bug.cgi?id=201014
+
+        Reviewed by Ryosuke Niwa.
+
+        When an <feImage> references an <svg> element as its target image but
+        this <svg> element is also one of the ancestors of the <feImage>, the
+        parent <filter> should not be applied.
+
+        Test: svg/filters/filter-image-ref-root.html
+
+        * svg/SVGFEImageElement.cpp:
+        (WebCore::SVGFEImageElement::build const):
+
 2019-08-22  Ryosuke Niwa  <rn...@webkit.org>
 
         Make ImageBuffer and SVG's FilterData isoheap'ed

Modified: trunk/Source/WebCore/svg/SVGFEImageElement.cpp (249025 => 249026)


--- trunk/Source/WebCore/svg/SVGFEImageElement.cpp	2019-08-22 19:25:48 UTC (rev 249025)
+++ trunk/Source/WebCore/svg/SVGFEImageElement.cpp	2019-08-22 21:13:38 UTC (rev 249026)
@@ -185,6 +185,11 @@
 {
     if (m_cachedImage)
         return FEImage::createWithImage(filter, m_cachedImage->imageForRenderer(renderer()), preserveAspectRatio());
+
+    auto target = SVGURIReference::targetElementFromIRIString(href(), treeScope());
+    if (isDescendantOrShadowDescendantOf(target.element.get()))
+        return nullptr;
+
     return FEImage::createWithIRIReference(filter, treeScope(), href(), preserveAspectRatio());
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to