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
Branches
Tags
No related merge requests found
......@@ -71,7 +71,7 @@ void YamlEmitter::open()
void YamlEmitter::close()
{
// yaml_emitter_delete(&emitter);
yaml_emitter_delete (&emitter);
if (!fd)
throw YamlEmitterException ("File descriptor not valid");
......
......@@ -52,6 +52,44 @@ YamlNode *YamlDocument::popNode()
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)
{
Mapping::iterator it = map.end();
......@@ -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)
{
......@@ -92,5 +167,43 @@ void SequenceNode::addNode (YamlNode *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
YamlNode (NodeType t, YamlNode *top=NULL) : type (t), topNode (top) {}
~YamlNode() {}
~YamlNode (void) {}
NodeType getType() {
NodeType getType (void) {
return type;
}
YamlNode *getTopNode() {
YamlNode *getTopNode (void) {
return topNode;
}
virtual void deleteChildNodes (void) = 0;
private:
NodeType type;
......@@ -111,6 +113,8 @@ class YamlDocument : YamlNode
return &doc;
}
virtual void deleteChildNodes (void);
private:
Sequence doc;
......@@ -132,6 +136,8 @@ class SequenceNode : public YamlNode
void addNode (YamlNode *node);
virtual void deleteChildNodes (void);
private:
Sequence seq;
......@@ -164,6 +170,8 @@ class MappingNode : public YamlNode
YamlNode *getValue (Key key);
virtual void deleteChildNodes (void);
private:
Mapping map;
......@@ -190,6 +198,8 @@ class ScalarNode : public YamlNode
val = v;
}
virtual void deleteChildNodes (void) {}
private:
Value val;
......
......@@ -73,9 +73,6 @@ void YamlParser::open()
void YamlParser::close()
{
yaml_parser_delete (&parser);
if (!fd)
throw YamlParserException ("File descriptor not valid");
......@@ -83,7 +80,13 @@ void YamlParser::close()
if (fclose (fd))
throw YamlParserException ("Error closing file descriptor");
yaml_parser_delete (&parser);
if (doc) {
doc->deleteChildNodes();
delete doc;
doc = NULL;
}
}
void YamlParser::serializeEvents()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment