svg_loader: allow multiple <defs> tags without data and memory leak (#528)
authorMichal Maciola <71131832+mmaciola@users.noreply.github.com>
Wed, 30 Jun 2021 08:21:30 +0000 (10:21 +0200)
committerHermet Park <chuneon.park@samsung.com>
Fri, 2 Jul 2021 01:50:31 +0000 (10:50 +0900)
* svg_loader: allow multiple defs without data and memory leak

If the svg file contained multiple <defs> tags, each subsequent tag
overwritten the previous tag. This resulted in incorrect rendering of the
file and memory leaks.

@Issues: 491

* svg_loader: allow multiple defs without data and memory leak- fix #1

Changed the idea to abandon node creating instead of deleting it after
creation. Removed simpleXmlParseAttributes for _createDefsNode.

Change-Id: Iada1c467949228e116a637c8fd37ceabb5dc34bb

src/loaders/svg/tvgSvgLoader.cpp

index cb1262c..b21f01b 100644 (file)
@@ -1068,9 +1068,8 @@ static SvgNode* _createNode(SvgNode* parent, SvgNodeType type)
 
 static SvgNode* _createDefsNode(TVG_UNUSED SvgLoaderData* loader, TVG_UNUSED SvgNode* parent, const char* buf, unsigned bufLength)
 {
+    if (loader->def && loader->doc->node.doc.defs) return nullptr;
     SvgNode* node = _createNode(nullptr, SvgNodeType::Defs);
-    if (!node) return nullptr;
-    simpleXmlParseAttributes(buf, bufLength, nullptr, node);
     return node;
 }
 
@@ -2199,6 +2198,7 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content,
             node = method(loader, parent, attrs, attrsLength);
         }
 
+        if (!node) return;
         if (node->type == SvgNodeType::Defs) {
             loader->doc->node.doc.defs = node;
             loader->def = node;