Source/WebCore/ChangeLog

 12014-09-25 Said Abou-Hallawa <sabouhallawa@apple.com>
 2
 3 Stack overflow with enormous SVG filter
 4 https://bugs.webkit.org/show_bug.cgi?id=63290
 5
 6 Prevent building an SVG filter if it has more than 200 FilterEffect nodes in its map
 7 regardless whether they will be connected to its lastEffect or not. Also discard any
 8 filter which has 100 or more contributing FilterEffect's in its tree.
 9
 10 Reviewed by NOBODY (OOPS!).
 11
 12 Tests: svg/filters/svg-deeply-nested-crash.html
 13
 14 * platform/graphics/filters/FilterEffect.cpp:
 15 (WebCore::FilterEffect::depthOfEffectInputs):
 16 * platform/graphics/filters/FilterEffect.h:
 17 -- Add a method to return the total number of input FilterEffect's contributing to a FilterEffect.
 18 * rendering/svg/RenderSVGResourceFilter.cpp:
 19 (WebCore::RenderSVGResourceFilter::buildPrimitives):
 20 -- Do not build a filter if its has more than 200 FilterEffect's in its map.
 21 (WebCore::RenderSVGResourceFilter::applyResource):
 22 -- Discard a filter after it has more than 100 FilterEffect's in its tree.
 23
1242014-09-25 Jeremy Jones <jeremyj@apple.com>
225
326 Race in ref pointer for WebVideoFullscreenInterfaceAVKit.
173976

Source/WebCore/platform/graphics/filters/FilterEffect.cpp

@@FilterEffect* FilterEffect::inputEffect(
104104 return m_inputEffects.at(number).get();
105105}
106106
 107unsigned FilterEffect::numberOfEffectInputsRecursive() const
 108{
 109 unsigned size = m_inputEffects.size();
 110 unsigned count = 0;
 111 for (unsigned i = 0; i < size; ++i) {
 112 FilterEffect* in = m_inputEffects.at(i).get();
 113 count += in->numberOfEffectInputsRecursive();
 114 }
 115 return count + 1;
 116}
 117
107118#if ENABLE(OPENCL)
108119void FilterEffect::applyAll()
109120{
173660

Source/WebCore/platform/graphics/filters/FilterEffect.h

@@public:
7878 FilterEffectVector& inputEffects() { return m_inputEffects; }
7979 FilterEffect* inputEffect(unsigned) const;
8080 unsigned numberOfEffectInputs() const { return m_inputEffects.size(); }
 81 unsigned numberOfEffectInputsRecursive() const;
8182
8283 inline bool hasResult() const
8384 {
173660

Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp

@@void RenderSVGResourceFilter::removeClie
7676
7777std::unique_ptr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitives(SVGFilter* filter) const
7878{
 79 static const unsigned maxCountChildNodes = 200;
 80 if (filterElement().countChildNodes() > maxCountChildNodes)
 81 return nullptr;
 82
7983 FloatRect targetBoundingBox = filter->targetBoundingBox();
8084
8185 // Add effects to the builder

@@bool RenderSVGResourceFilter::applyResou
172176 // Set the scale level in SVGFilter.
173177 filterData->filter->setFilterResolution(scale);
174178
 179 static const unsigned maxNumberOfEffectInputsRecursive = 100;
175180 FilterEffect* lastEffect = filterData->builder->lastEffect();
176  if (!lastEffect)
 181 if (!lastEffect || lastEffect->numberOfEffectInputsRecursive() > maxNumberOfEffectInputsRecursive)
177182 return false;
178183
179184 RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion(lastEffect);
173660

LayoutTests/ChangeLog

 12014-09-25 Said Abou-Hallawa <sabouhallawa@apple.com>
 2
 3 Stack overflow with enormous SVG filter.
 4 https://bugs.webkit.org/show_bug.cgi?id=63290.
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Test if an SVG filter with deeply nested tree of FilterEffect's can be loaded
 9 with no crash. Make sure other valid filters can still be referenced by SVG
 10 drawing elements.
 11
 12 * svg/filters/svg-deeply-nested-crash-expected.txt: Added.
 13 * svg/filters/svg-deeply-nested-crash.html: Added.
 14
1152014-09-25 Javier Fernandez <jfernandez@igalia.com>
216
317 ASSERTION FAILED: columnCount in WebCore::CSSParser::parseGridTemplateAreasRow
173978

LayoutTests/svg/filters/svg-deeply-nested-crash-expected.txt

 1PASS
0

LayoutTests/svg/filters/svg-deeply-nested-crash.html

 1<!DOCTYPE html>
 2<script>
 3if (window.testRunner)
 4 testRunner.dumpAsText();
 5window.addEventListener("load", function () {
 6 var filter = document.getElementById("ignored");
 7 for (var i = 0; i < 100000; i++) {
 8 var feElement = document.createElementNS("http://www.w3.org/2000/svg", "feGaussianBlur");
 9 feElement.setAttribute("stdDeviation", "1.0");
 10 filter.appendChild(feElement);
 11 }
 12}, false);
 13</script>
 14<svg width="500" height="300" xmlns="http://www.w3.org/2000/svg">
 15<defs>
 16 <filter id="ignored">
 17 </filter>
 18 <filter id="ShiftAndBlur">
 19 <feOffset dx="10" dy="10" />
 20 <feGaussianBlur stdDeviation="8.0" />
 21 </filter>
 22</defs>
 23<rect fill="red" x="10px" y="10px" width="20px" height="20px" filter="url(#ignored)"/>
 24<circle fill="green" cx="100" cy="100" r="100"filter="url(#ShiftAndBlur)" />
 25<text transform="translate(210,210)">
 26 PASS
 27</text>
 28</svg>
0