summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-12-07 10:24:16 +0000
committerCaolán McNamara <caolanm@redhat.com>2016-12-07 10:24:53 +0000
commit62283fed204e05e3f30a8ae703762d7f96c4e88a (patch)
tree2b7b99d611bdf1edf2387a9de313a9d2ebb09a69 /filter
parent1d752159f482ac5d96f2115a7c8c579b22920730 (diff)
crashtesting: "use" loop in moz325427-1.svg
Change-Id: I6ea2aaa5ca857d89342b9d18bd4cbedbeeea2b2f
Diffstat (limited to 'filter')
-rw-r--r--filter/source/svg/svgreader.cxx48
1 files changed, 29 insertions, 19 deletions
diff --git a/filter/source/svg/svgreader.cxx b/filter/source/svg/svgreader.cxx
index 377a74680037..5524379a012e 100644
--- a/filter/source/svg/svgreader.cxx
+++ b/filter/source/svg/svgreader.cxx
@@ -189,6 +189,33 @@ struct AnnotatingVisitor
writeStyle(xElem,nTagId);
}
+ bool IsAncestorId(const uno::Reference<xml::dom::XNode>& xParentNode, const OUString& rValue)
+ {
+ bool bSelfCycle = false;
+ if (xParentNode.is())
+ {
+ if (xParentNode->hasAttributes())
+ {
+ const uno::Reference<xml::dom::XNamedNodeMap> xParentAttributes = xParentNode->getAttributes();
+ const sal_Int32 nFooNumAttrs(xParentAttributes->getLength());
+ for (sal_Int32 i=0; i < nFooNumAttrs; ++i)
+ {
+ const sal_Int32 nTokenId(getTokenId(xParentAttributes->item(i)->getNodeName()));
+ if (XML_ID == nTokenId)
+ {
+ OUString sParentID = xParentAttributes->item(i)->getNodeValue();
+ bSelfCycle = sParentID == rValue;
+ break;
+ }
+ }
+ }
+
+ if (!bSelfCycle)
+ bSelfCycle = IsAncestorId(xParentNode->getParentNode(), rValue);
+ }
+ return bSelfCycle;
+ }
+
void operator()( const uno::Reference<xml::dom::XElement>& xElem,
const uno::Reference<xml::dom::XNamedNodeMap>& xAttributes )
{
@@ -294,27 +321,10 @@ struct AnnotatingVisitor
bool bFound = aFound != maElementIdMap.end();
if (bFound)
{
- bool bSelfCycle = false;
-
- uno::Reference<xml::dom::XNode> xParentNode(xElem->getParentNode());
- if (xParentNode.is() && xParentNode->hasAttributes())
- {
- const uno::Reference<xml::dom::XNamedNodeMap> xParentAttributes = xParentNode->getAttributes();
- const sal_Int32 nFooNumAttrs(xParentAttributes->getLength());
- for (sal_Int32 i=0; i < nFooNumAttrs; ++i)
- {
- const sal_Int32 nTokenId(getTokenId(xParentAttributes->item(i)->getNodeName()));
- if (XML_ID == nTokenId)
- {
- OUString sParentID = xParentAttributes->item(i)->getNodeValue();
- bSelfCycle = sParentID == sValue;
- break;
- }
- }
- }
-
+ const bool bSelfCycle = IsAncestorId(xElem->getParentNode(), sValue);
if (bSelfCycle)
{
+ SAL_WARN("filter.svg", "\"use\" declaration with target of ancestor node, causing use cycle");
//drop this invalid self-referencing "use" node
maElementIdMap.erase(aFound);
bFound = false;