summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-08-30 14:05:20 +0100
committerCaolán McNamara <caolanm@redhat.com>2018-08-31 09:27:10 +0200
commit1fe8479e5ba4ec092d6dc6d88a1edd5fb4487542 (patch)
tree1490fb537c7d33d3e94321b23be6cb20fc19673b /svgio
parent1240a0749e6a23a1a150df61e6a2e05c6b7b55be (diff)
tdf#119557 style hierarchy isn't stable so looping check fails falsely
Given the css stuff a given style can end up with itself as a grandparent but then the css mutates things so it doesn't loop around to give itself as a grandgrandparent. So undo the loop detection check and turn it into a parse depth test instead with an arbitrary, but high, level Change-Id: If28684ad2b2adc664bc2da6b176b93248b377162 Reviewed-on: https://gerrit.libreoffice.org/59813 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'svgio')
-rw-r--r--svgio/inc/svgstyleattributes.hxx2
-rw-r--r--svgio/source/svgreader/svgstyleattributes.cxx184
2 files changed, 94 insertions, 92 deletions
diff --git a/svgio/inc/svgstyleattributes.hxx b/svgio/inc/svgstyleattributes.hxx
index 44f4d35ab9b4..a024dc68b789 100644
--- a/svgio/inc/svgstyleattributes.hxx
+++ b/svgio/inc/svgstyleattributes.hxx
@@ -231,7 +231,7 @@ namespace svgio
BaselineShift maBaselineShift;
SvgNumber maBaselineShiftNumber;
- mutable bool mbResolvingParent;
+ mutable std::vector<sal_uInt16> maResolvingParent;
// defines if this attributes are part of a ClipPath. If yes,
// rough geometry will be created on decomposition by patching
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx
index 8e6d9ea49fef..5f5d9df13584 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -43,6 +43,8 @@
#include <drawinglayer/primitive2d/maskprimitive2d.hxx>
#include <drawinglayer/primitive2d/pagehierarchyprimitive2d.hxx>
+const int nStyleDepthLimit = 1024;
+
namespace svgio
{
namespace svgreader
@@ -1292,7 +1294,7 @@ namespace svgio
maClipRule(FillRule_nonzero),
maBaselineShift(BaselineShift_Baseline),
maBaselineShiftNumber(0),
- mbResolvingParent(false),
+ maResolvingParent(30, 0),
mbIsClipPathContent(SVGTokenClipPathNode == mrOwner.getType()),
mbStrokeDasharraySet(false)
{
@@ -2032,11 +2034,11 @@ namespace svgio
{
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[0] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[0];
const basegfx::BColor* pFill = pSvgStyleAttributes->getFill();
- mbResolvingParent = false;
+ --maResolvingParent[0];
if(mbIsClipPathContent)
{
@@ -2077,11 +2079,11 @@ namespace svgio
{
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[1] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[1];
auto ret = pSvgStyleAttributes->getStroke();
- mbResolvingParent = false;
+ --maResolvingParent[1];
return ret;
}
}
@@ -2111,11 +2113,11 @@ namespace svgio
{
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[2] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[2];
auto ret = pSvgStyleAttributes->getSvgGradientNodeFill();
- mbResolvingParent = false;
+ --maResolvingParent[2];
return ret;
}
}
@@ -2133,11 +2135,11 @@ namespace svgio
{
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[3] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[3];
auto ret = pSvgStyleAttributes->getSvgGradientNodeStroke();
- mbResolvingParent = false;
+ --maResolvingParent[3];
return ret;
}
}
@@ -2155,11 +2157,11 @@ namespace svgio
{
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[4] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[4];
auto ret = pSvgStyleAttributes->getSvgPatternNodeFill();
- mbResolvingParent = false;
+ --maResolvingParent[4];
return ret;
}
}
@@ -2177,11 +2179,11 @@ namespace svgio
{
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[5] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[5];
auto ret = pSvgStyleAttributes->getSvgPatternNodeStroke();
- mbResolvingParent = false;
+ --maResolvingParent[5];
return ret;
}
}
@@ -2198,11 +2200,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[6] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[6];
auto ret = pSvgStyleAttributes->getStrokeWidth();
- mbResolvingParent = false;
+ --maResolvingParent[6];
return ret;
}
@@ -2235,11 +2237,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[7] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[7];
auto ret = pSvgStyleAttributes->getFillOpacity();
- mbResolvingParent = false;
+ --maResolvingParent[7];
return ret;
}
@@ -2256,11 +2258,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[8] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[8];
auto ret = pSvgStyleAttributes->getOpacity();
- mbResolvingParent = false;
+ --maResolvingParent[8];
return ret;
}
@@ -2274,11 +2276,11 @@ namespace svgio
{
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[9] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[9];
auto ret = pSvgStyleAttributes->getVisibility();
- mbResolvingParent = false;
+ --maResolvingParent[9];
return ret;
}
//default is Visible
@@ -2327,11 +2329,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[10] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[10];
auto ret = pSvgStyleAttributes->getFillRule();
- mbResolvingParent = false;
+ --maResolvingParent[10];
return ret;
}
@@ -2353,11 +2355,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[11] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[11];
const SvgNumberVector& ret = pSvgStyleAttributes->getStrokeDasharray();
- mbResolvingParent = false;
+ --maResolvingParent[11];
return ret;
}
@@ -2374,11 +2376,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[12] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[12];
auto ret = pSvgStyleAttributes->getStrokeDashOffset();
- mbResolvingParent = false;
+ --maResolvingParent[12];
return ret;
}
@@ -2395,11 +2397,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[13] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[13];
auto ret = pSvgStyleAttributes->getStrokeLinecap();
- mbResolvingParent = false;
+ --maResolvingParent[13];
return ret;
}
@@ -2416,11 +2418,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[14] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[14];
auto ret = pSvgStyleAttributes->getStrokeLinejoin();
- mbResolvingParent = false;
+ --maResolvingParent[14];
return ret;
}
@@ -2437,11 +2439,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[15] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[15];
auto ret = pSvgStyleAttributes->getStrokeMiterLimit();
- mbResolvingParent = false;
+ --maResolvingParent[15];
return ret;
}
@@ -2458,11 +2460,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[16] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[16];
auto ret = pSvgStyleAttributes->getStrokeOpacity();
- mbResolvingParent = false;
+ --maResolvingParent[16];
return ret;
}
@@ -2479,11 +2481,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[17] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[17];
const SvgStringVector& ret = pSvgStyleAttributes->getFontFamily();
- mbResolvingParent = false;
+ --maResolvingParent[17];
return ret;
}
@@ -2619,11 +2621,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[18] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[18];
FontStretch aInherited = pSvgStyleAttributes->getFontStretch();
- mbResolvingParent = false;
+ --maResolvingParent[18];
if(FontStretch_wider == maFontStretch)
{
@@ -2650,11 +2652,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[19] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[19];
auto ret = pSvgStyleAttributes->getFontStyle();
- mbResolvingParent = false;
+ --maResolvingParent[19];
return ret;
}
@@ -2674,11 +2676,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[20] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[20];
FontWeight aInherited = pSvgStyleAttributes->getFontWeight();
- mbResolvingParent = false;
+ --maResolvingParent[20];
if(FontWeight_bolder == maFontWeight)
{
@@ -2705,11 +2707,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[21] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[21];
auto ret = pSvgStyleAttributes->getTextAlign();
- mbResolvingParent = false;
+ --maResolvingParent[21];
return ret;
}
@@ -2726,11 +2728,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[22] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[22];
auto ret = pSvgStyleAttributes->getTextDecorationDefiningSvgStyleAttributes();
- mbResolvingParent = false;
+ --maResolvingParent[22];
return ret;
}
@@ -2762,11 +2764,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[23] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[23];
auto ret = pSvgStyleAttributes->getTextAnchor();
- mbResolvingParent = false;
+ --maResolvingParent[23];
return ret;
}
@@ -2792,11 +2794,11 @@ namespace svgio
{
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[24] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[24];
auto ret = pSvgStyleAttributes->getColor();
- mbResolvingParent = false;
+ --maResolvingParent[24];
return ret;
}
}
@@ -2833,11 +2835,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !pSvgStyleAttributes->maMaskXLink.isEmpty() && !mbResolvingParent)
+ if (pSvgStyleAttributes && !pSvgStyleAttributes->maMaskXLink.isEmpty() && maResolvingParent[25] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[25];
auto ret = pSvgStyleAttributes->getMaskXLink();
- mbResolvingParent = false;
+ --maResolvingParent[25];
return ret;
}
@@ -2868,11 +2870,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[26] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[26];
auto ret = pSvgStyleAttributes->getMarkerStartXLink();
- mbResolvingParent = false;
+ --maResolvingParent[26];
return ret;
}
@@ -2903,11 +2905,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[27] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[27];
auto ret = pSvgStyleAttributes->getMarkerMidXLink();
- mbResolvingParent = false;
+ --maResolvingParent[27];
return ret;
}
@@ -2938,11 +2940,11 @@ namespace svgio
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[28] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[28];
auto ret = pSvgStyleAttributes->getMarkerEndXLink();
- mbResolvingParent = false;
+ --maResolvingParent[28];
return ret;
}
@@ -2971,11 +2973,11 @@ namespace svgio
{
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
- if (pSvgStyleAttributes && !mbResolvingParent)
+ if (pSvgStyleAttributes && maResolvingParent[29] < nStyleDepthLimit)
{
- mbResolvingParent = true;
+ ++maResolvingParent[29];
const SvgNumber aParentNumber = pSvgStyleAttributes->getBaselineShiftNumber();
- mbResolvingParent = false;
+ --maResolvingParent[29];
return SvgNumber(
aParentNumber.getNumber() * maBaselineShiftNumber.getNumber() * 0.01,