Skip to content
Snippets Groups Projects
Commit 5c4c974b authored by Alexandre Savard's avatar Alexandre Savard
Browse files

[#4622] Fix leaks in yaml serialization engine

parent 5a50199e
No related branches found
No related tags found
No related merge requests found
...@@ -71,7 +71,7 @@ void YamlEmitter::open() ...@@ -71,7 +71,7 @@ void YamlEmitter::open()
void YamlEmitter::close() void YamlEmitter::close()
{ {
// yaml_emitter_delete(&emitter); yaml_emitter_delete (&emitter);
if (!fd) if (!fd)
throw YamlEmitterException ("File descriptor not valid"); throw YamlEmitterException ("File descriptor not valid");
......
...@@ -52,6 +52,44 @@ YamlNode *YamlDocument::popNode() ...@@ -52,6 +52,44 @@ YamlNode *YamlDocument::popNode()
return node; return node;
} }
void YamlDocument::deleteChildNodes()
{
Sequence::iterator it = doc.begin();
while (it != doc.end()) {
YamlNode *yamlNode = static_cast<YamlNode *> (*it);
switch (yamlNode->getType()) {
case DOCUMENT:
break;
case SEQUENCE: {
SequenceNode *sequence = static_cast<SequenceNode *> (yamlNode);
sequence->deleteChildNodes();
delete sequence;
sequence = NULL;
}
break;
case MAPPING: {
MappingNode *mapping = static_cast<MappingNode *> (yamlNode);
mapping->deleteChildNodes();
delete mapping;
mapping = NULL;
}
break;
case SCALAR: {
ScalarNode *scalar = static_cast<ScalarNode *> (yamlNode);
delete scalar;
scalar = NULL;
}
break;
default:
break;
}
it++;
}
}
void MappingNode::addNode (YamlNode *node) void MappingNode::addNode (YamlNode *node)
{ {
Mapping::iterator it = map.end(); Mapping::iterator it = map.end();
...@@ -85,6 +123,43 @@ YamlNode *MappingNode::getValue (Key key) ...@@ -85,6 +123,43 @@ YamlNode *MappingNode::getValue (Key key)
} }
} }
void MappingNode::deleteChildNodes()
{
Mapping::iterator it = map.begin();
while (it != map.end()) {
YamlNode *yamlNode = static_cast<YamlNode *> (it->second);
switch (yamlNode->getType()) {
case DOCUMENT:
break;
case SEQUENCE: {
SequenceNode *sequence = static_cast<SequenceNode *> (yamlNode);
sequence->deleteChildNodes();
delete sequence;
sequence = NULL;
}
break;
case MAPPING: {
MappingNode *mapping = static_cast<MappingNode *> (yamlNode);
mapping->deleteChildNodes();
delete mapping;
mapping = NULL;
}
break;
case SCALAR: {
ScalarNode *scalar = static_cast<ScalarNode *> (yamlNode);
delete scalar;
scalar = NULL;
}
break;
default:
break;
}
it++;
}
}
void SequenceNode::addNode (YamlNode *node) void SequenceNode::addNode (YamlNode *node)
{ {
...@@ -92,5 +167,43 @@ void SequenceNode::addNode (YamlNode *node) ...@@ -92,5 +167,43 @@ void SequenceNode::addNode (YamlNode *node)
seq.insert (it, node); seq.insert (it, node);
} }
void SequenceNode::deleteChildNodes()
{
Sequence::iterator it = seq.begin();
while (it != seq.end()) {
YamlNode *yamlNode = static_cast<YamlNode *> (*it);
switch (yamlNode->getType()) {
case DOCUMENT:
break;
case SEQUENCE: {
SequenceNode *sequence = static_cast<SequenceNode *> (yamlNode);
sequence->deleteChildNodes();
delete sequence;
sequence = NULL;
}
break;
case MAPPING: {
MappingNode *mapping = static_cast<MappingNode *> (yamlNode);
mapping->deleteChildNodes();
delete mapping;
mapping = NULL;
}
break;
case SCALAR: {
ScalarNode *scalar = static_cast<ScalarNode *> (yamlNode);
delete scalar;
scalar = NULL;
}
break;
default:
break;
}
it++;
}
} }
}
...@@ -75,16 +75,18 @@ class YamlNode ...@@ -75,16 +75,18 @@ class YamlNode
YamlNode (NodeType t, YamlNode *top=NULL) : type (t), topNode (top) {} YamlNode (NodeType t, YamlNode *top=NULL) : type (t), topNode (top) {}
~YamlNode() {} ~YamlNode (void) {}
NodeType getType() { NodeType getType (void) {
return type; return type;
} }
YamlNode *getTopNode() { YamlNode *getTopNode (void) {
return topNode; return topNode;
} }
virtual void deleteChildNodes (void) = 0;
private: private:
NodeType type; NodeType type;
...@@ -111,6 +113,8 @@ class YamlDocument : YamlNode ...@@ -111,6 +113,8 @@ class YamlDocument : YamlNode
return &doc; return &doc;
} }
virtual void deleteChildNodes (void);
private: private:
Sequence doc; Sequence doc;
...@@ -132,6 +136,8 @@ class SequenceNode : public YamlNode ...@@ -132,6 +136,8 @@ class SequenceNode : public YamlNode
void addNode (YamlNode *node); void addNode (YamlNode *node);
virtual void deleteChildNodes (void);
private: private:
Sequence seq; Sequence seq;
...@@ -164,6 +170,8 @@ class MappingNode : public YamlNode ...@@ -164,6 +170,8 @@ class MappingNode : public YamlNode
YamlNode *getValue (Key key); YamlNode *getValue (Key key);
virtual void deleteChildNodes (void);
private: private:
Mapping map; Mapping map;
...@@ -190,6 +198,8 @@ class ScalarNode : public YamlNode ...@@ -190,6 +198,8 @@ class ScalarNode : public YamlNode
val = v; val = v;
} }
virtual void deleteChildNodes (void) {}
private: private:
Value val; Value val;
......
...@@ -73,9 +73,6 @@ void YamlParser::open() ...@@ -73,9 +73,6 @@ void YamlParser::open()
void YamlParser::close() void YamlParser::close()
{ {
yaml_parser_delete (&parser);
if (!fd) if (!fd)
throw YamlParserException ("File descriptor not valid"); throw YamlParserException ("File descriptor not valid");
...@@ -83,7 +80,13 @@ void YamlParser::close() ...@@ -83,7 +80,13 @@ void YamlParser::close()
if (fclose (fd)) if (fclose (fd))
throw YamlParserException ("Error closing file descriptor"); throw YamlParserException ("Error closing file descriptor");
yaml_parser_delete (&parser);
if (doc) {
doc->deleteChildNodes();
delete doc;
doc = NULL;
}
} }
void YamlParser::serializeEvents() void YamlParser::serializeEvents()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment