diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-12-07 10:24:16 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-12-07 10:24:53 +0000 |
commit | 62283fed204e05e3f30a8ae703762d7f96c4e88a (patch) | |
tree | 2b7b99d611bdf1edf2387a9de313a9d2ebb09a69 /filter | |
parent | 1d752159f482ac5d96f2115a7c8c579b22920730 (diff) |
crashtesting: "use" loop in moz325427-1.svg
Change-Id: I6ea2aaa5ca857d89342b9d18bd4cbedbeeea2b2f
Diffstat (limited to 'filter')
-rw-r--r-- | filter/source/svg/svgreader.cxx | 48 |
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; |