tree data BUGFIX memory leaks
diff --git a/src/tree_data_new.c b/src/tree_data_new.c
index 42b9e9b..cac5ae0 100644
--- a/src/tree_data_new.c
+++ b/src/tree_data_new.c
@@ -245,6 +245,7 @@
case LYD_ANYDATA_DATATREE:
case LYD_ANYDATA_STRING:
/* unreachable */
+ ly_in_free(in, 0);
LOGINT_RET(ctx);
case LYD_ANYDATA_XML:
r = lyd_parse_xml(ctx, NULL, NULL, tree, in, parse_opts, 0, int_opts, NULL, NULL, &lydctx);
@@ -274,7 +275,7 @@
{
LY_ERR ret;
struct lyd_node *tree;
- struct lyd_node_any *any;
+ struct lyd_node_any *any = NULL;
union lyd_any_value any_val;
assert(schema->nodetype & LYD_NODE_ANY);
@@ -288,7 +289,7 @@
if ((schema->nodetype == LYS_ANYDATA) && (value_type != LYD_ANYDATA_DATATREE)) {
/* only a data tree can be stored */
- LY_CHECK_RET(lyd_create_anydata_datatree(schema->module->ctx, value, value_type, &tree));
+ LY_CHECK_GOTO(ret = lyd_create_anydata_datatree(schema->module->ctx, value, value_type, &tree), error);
if (use_value) {
free((void *)value);
}
@@ -305,7 +306,7 @@
case LYD_ANYDATA_STRING:
case LYD_ANYDATA_XML:
case LYD_ANYDATA_JSON:
- LY_CHECK_ERR_RET(lydict_insert_zc(schema->module->ctx, (void *)value, &any->value.str), free(any), LY_EMEM);
+ LY_CHECK_GOTO(ret = lydict_insert_zc(schema->module->ctx, (void *)value, &any->value.str), error);
break;
case LYD_ANYDATA_LYB:
any->value.mem = (void *)value;
@@ -314,13 +315,16 @@
any->value_type = value_type;
} else {
any_val.str = value;
- ret = lyd_any_copy_value(&any->node, &any_val, value_type);
- LY_CHECK_ERR_RET(ret, free(any), ret);
+ LY_CHECK_GOTO(ret = lyd_any_copy_value(&any->node, &any_val, value_type), error);
}
lyd_hash(&any->node);
*node = &any->node;
return LY_SUCCESS;
+
+error:
+ free(any);
+ return ret;
}
LY_ERR