[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