Crash may happen when an SVG <feImage> element references the root <svg> element
authorsaid@apple.com <said@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Aug 2019 21:13:38 +0000 (21:13 +0000)
committersaid@apple.com <said@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Aug 2019 21:13:38 +0000 (21:13 +0000)
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.

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

LayoutTests/ChangeLog
LayoutTests/svg/filters/filter-image-ref-root-expected.txt [new file with mode: 0644]
LayoutTests/svg/filters/filter-image-ref-root.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/svg/SVGFEImageElement.cpp

index 6e0150e..6057177 100644 (file)
@@ -1,3 +1,16 @@
+2019-08-22  Said Abou-Hallawa  <sabouhallawa@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_horton@apple.com>
 
         Rebaseline some editing tests after r248974
diff --git a/LayoutTests/svg/filters/filter-image-ref-root-expected.txt b/LayoutTests/svg/filters/filter-image-ref-root-expected.txt
new file mode 100644 (file)
index 0000000..0163abc
--- /dev/null
@@ -0,0 +1,2 @@
+This test passes if it does not crash.
+
diff --git a/LayoutTests/svg/filters/filter-image-ref-root.html b/LayoutTests/svg/filters/filter-image-ref-root.html
new file mode 100644 (file)
index 0000000..2e2152f
--- /dev/null
@@ -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="#svgx"/>
+        </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>
index b435628..1bb7202 100644 (file)
@@ -1,3 +1,19 @@
+2019-08-22  Said Abou-Hallawa  <sabouhallawa@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  <rniwa@webkit.org>
 
         Make ImageBuffer and SVG's FilterData isoheap'ed
index f432170..8f8213a 100644 (file)
@@ -185,6 +185,11 @@ RefPtr<FilterEffect> SVGFEImageElement::build(SVGFilterBuilder*, Filter& filter)
 {
     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());
 }