schema compile BUGFIX memory leaks
Found by coverity.
diff --git a/src/tree_schema_compile.c b/src/tree_schema_compile.c
index c98c1d6..2fcea59 100644
--- a/src/tree_schema_compile.c
+++ b/src/tree_schema_compile.c
@@ -200,9 +200,15 @@
}
r->dflt = malloc(sizeof *r->dflt);
- lysp_qname_dup(ctx->ctx, r->dflt, dflt);
+ LY_CHECK_GOTO(!r->dflt, error);
+ LY_CHECK_GOTO(lysp_qname_dup(ctx->ctx, r->dflt, dflt), error);
return LY_SUCCESS;
+
+error:
+ free(r->dflt);
+ LOGMEM(ctx->ctx);
+ return LY_EMEM;
}
/**
@@ -4834,7 +4840,7 @@
struct lysc_node *child;
struct lysp_grp *grp = NULL;
uint32_t i, grp_stack_count;
- struct lys_module *grp_mod, *mod_old;
+ struct lys_module *grp_mod, *mod_old = ctx->mod_def;
LY_ERR ret = LY_SUCCESS;
struct lysc_when **when, *when_shared;
LY_ARRAY_COUNT_TYPE u;
@@ -4864,7 +4870,6 @@
LY_CHECK_GOTO(ret, cleanup);
/* switch context's mod_def */
- mod_old = ctx->mod_def;
ctx->mod_def = grp_mod;
/* compile data nodes */
@@ -5426,7 +5431,8 @@
static LY_ERR
lysp_dup_single(const struct ly_ctx *ctx, const struct lysp_node *pnode, ly_bool with_links, struct lysp_node **dup_p)
{
- void *mem;
+ LY_ERR ret = LY_SUCCESS;
+ void *mem = NULL;
if (!pnode) {
*dup_p = NULL;
@@ -5436,56 +5442,56 @@
switch (pnode->nodetype) {
case LYS_CONTAINER:
mem = calloc(1, sizeof(struct lysp_node_container));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_node_dup(ctx, mem, pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_node_dup(ctx, mem, pnode), cleanup);
break;
case LYS_LEAF:
mem = calloc(1, sizeof(struct lysp_node_leaf));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_node_dup(ctx, mem, pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_node_dup(ctx, mem, pnode), cleanup);
break;
case LYS_LEAFLIST:
mem = calloc(1, sizeof(struct lysp_node_leaflist));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_node_dup(ctx, mem, pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_node_dup(ctx, mem, pnode), cleanup);
break;
case LYS_LIST:
mem = calloc(1, sizeof(struct lysp_node_list));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_node_dup(ctx, mem, pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_node_dup(ctx, mem, pnode), cleanup);
break;
case LYS_CHOICE:
mem = calloc(1, sizeof(struct lysp_node_choice));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_node_dup(ctx, mem, pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_node_dup(ctx, mem, pnode), cleanup);
break;
case LYS_CASE:
mem = calloc(1, sizeof(struct lysp_node_case));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_node_dup(ctx, mem, pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_node_dup(ctx, mem, pnode), cleanup);
break;
case LYS_ANYDATA:
case LYS_ANYXML:
mem = calloc(1, sizeof(struct lysp_node_anydata));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_node_dup(ctx, mem, pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_node_dup(ctx, mem, pnode), cleanup);
break;
case LYS_INPUT:
case LYS_OUTPUT:
mem = calloc(1, sizeof(struct lysp_action_inout));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_action_inout_dup(ctx, mem, (struct lysp_action_inout *)pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_action_inout_dup(ctx, mem, (struct lysp_action_inout *)pnode), cleanup);
break;
case LYS_ACTION:
case LYS_RPC:
mem = calloc(1, sizeof(struct lysp_action));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_action_dup(ctx, mem, (struct lysp_action *)pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_action_dup(ctx, mem, (struct lysp_action *)pnode), cleanup);
break;
case LYS_NOTIF:
mem = calloc(1, sizeof(struct lysp_notif));
- LY_CHECK_ERR_RET(!mem, LOGMEM(ctx), LY_EMEM);
- LY_CHECK_RET(lysp_notif_dup(ctx, mem, (struct lysp_notif *)pnode));
+ LY_CHECK_ERR_GOTO(!mem, LOGMEM(ctx); ret = LY_EMEM, cleanup);
+ LY_CHECK_GOTO(ret = lysp_notif_dup(ctx, mem, (struct lysp_notif *)pnode), cleanup);
break;
default:
LOGINT_RET(ctx);
@@ -5512,8 +5518,13 @@
}
}
- *dup_p = mem;
- return LY_SUCCESS;
+cleanup:
+ if (ret) {
+ free(mem);
+ } else {
+ *dup_p = mem;
+ }
+ return ret;
}
#define AMEND_WRONG_NODETYPE(AMEND_STR, OP_STR, PROPERTY) \
@@ -6711,8 +6722,8 @@
LY_CHECK_GOTO(ret, cleanup);
/* augment was applied, remove it (index may have changed because other augments could have been applied) */
- lysc_augment_free(ctx->ctx, aug);
ly_set_rm(&ctx->uses_augs, aug, NULL);
+ lysc_augment_free(ctx->ctx, aug);
}
/* top-level augments */
@@ -6738,8 +6749,8 @@
LY_CHECK_GOTO(ret, cleanup);
/* augment was applied, remove it */
- lysc_augment_free(ctx->ctx, aug);
ly_set_rm(&ctx->augs, aug, NULL);
+ lysc_augment_free(ctx->ctx, aug);
}
cleanup: