[Libreoffice-commits] core.git: filter/source
Caolán McNamara
caolanm at redhat.com
Wed Dec 7 10:25:31 UTC 2016
filter/source/svg/svgreader.cxx | 48 ++++++++++++++++++++++++----------------
1 file changed, 29 insertions(+), 19 deletions(-)
New commits:
commit 62283fed204e05e3f30a8ae703762d7f96c4e88a
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Dec 7 10:24:16 2016 +0000
crashtesting: "use" loop in moz325427-1.svg
Change-Id: I6ea2aaa5ca857d89342b9d18bd4cbedbeeea2b2f
diff --git a/filter/source/svg/svgreader.cxx b/filter/source/svg/svgreader.cxx
index 377a746..5524379 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;
More information about the Libreoffice-commits
mailing list