From 62283fed204e05e3f30a8ae703762d7f96c4e88a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Wed, 7 Dec 2016 10:24:16 +0000 Subject: [PATCH] crashtesting: "use" loop in moz325427-1.svg Change-Id: I6ea2aaa5ca857d89342b9d18bd4cbedbeeea2b2f --- filter/source/svg/svgreader.cxx | 48 ++++++++++++++++++++------------- 1 file 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& xParentNode, const OUString& rValue) + { + bool bSelfCycle = false; + if (xParentNode.is()) + { + if (xParentNode->hasAttributes()) + { + const uno::Reference 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& xElem, const uno::Reference& xAttributes ) { @@ -294,27 +321,10 @@ struct AnnotatingVisitor bool bFound = aFound != maElementIdMap.end(); if (bFound) { - bool bSelfCycle = false; - - uno::Reference xParentNode(xElem->getParentNode()); - if (xParentNode.is() && xParentNode->hasAttributes()) - { - const uno::Reference 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;