schema compile BUGFIX always connect augments last
Not specified by the RFC but a reasonable assumption.
Fixes cesnet/libnetconf2#377
diff --git a/src/schema_compile_node.c b/src/schema_compile_node.c
index 02a1e51..30671d1 100644
--- a/src/schema_compile_node.c
+++ b/src/schema_compile_node.c
@@ -2563,9 +2563,6 @@
LY_CHECK_GOTO(ret, cleanup);
}
- /* connect any augments */
- LY_CHECK_GOTO(ret = lys_compile_node_augments(ctx, node), cleanup);
-
/* nodetype-specific part */
LY_CHECK_GOTO(ret = node_compile_spec(ctx, pnode, node), cleanup);
@@ -2620,6 +2617,9 @@
LY_CHECK_GOTO(ret = lys_compile_node(ctx, child_p, node, 0, NULL), done);
}
+ /* connect any augments */
+ LY_CHECK_GOTO(ret = lys_compile_node_augments(ctx, node), done);
+
ctx->compile_opts = prev_options;
done:
@@ -2712,6 +2712,9 @@
LY_CHECK_GOTO(ret, done);
}
+ /* connect any augments */
+ LY_CHECK_GOTO(ret = lys_compile_node_augments(ctx, node), done);
+
done:
return ret;
}
@@ -2753,6 +2756,9 @@
ret = lysc_unres_must_add(ctx, node, pnode);
LY_CHECK_GOTO(ret, done);
+ /* connect any augments */
+ LY_CHECK_GOTO(ret = lys_compile_node_augments(ctx, node), done);
+
LY_LIST_FOR((struct lysp_node *)cont_p->actions, child_p) {
ret = lys_compile_node(ctx, child_p, node, 0, NULL);
LY_CHECK_GOTO(ret, done);
@@ -3344,6 +3350,9 @@
lysc_update_path(ctx, NULL, NULL);
}
+ /* connect any augments */
+ LY_CHECK_GOTO(ret = lys_compile_node_augments(ctx, node), done);
+
/* uniques */
if (list_p->uniques) {
LY_CHECK_RET(lys_compile_node_list_unique(ctx, list_p->uniques, list));
@@ -3512,14 +3521,18 @@
assert(node->nodetype == LYS_CHOICE);
LY_LIST_FOR(ch_p->child, child_p) {
- LY_CHECK_RET(lys_compile_node_choice_child(ctx, child_p, node, NULL));
+ LY_CHECK_GOTO(ret = lys_compile_node_choice_child(ctx, child_p, node, NULL), done);
}
+ /* connect any augments */
+ LY_CHECK_GOTO(ret = lys_compile_node_augments(ctx, node), done);
+
/* default branch */
if (ch_p->dflt.str) {
- LY_CHECK_RET(lys_compile_node_choice_dflt(ctx, &ch_p->dflt, ch));
+ LY_CHECK_GOTO(ret = lys_compile_node_choice_dflt(ctx, &ch_p->dflt, ch), done);
}
+done:
return ret;
}
@@ -3569,6 +3582,7 @@
static LY_ERR
lys_compile_node_case(struct lysc_ctx *ctx, struct lysp_node *pnode, struct lysc_node *node)
{
+ LY_ERR ret = LY_SUCCESS;
struct lysp_node *child_p;
struct lysp_node_case *cs_p = (struct lysp_node_case *)pnode;
@@ -3577,13 +3591,17 @@
} else if (pnode->nodetype == LYS_CASE) {
/* explicit parent case */
LY_LIST_FOR(cs_p->child, child_p) {
- LY_CHECK_RET(lys_compile_node(ctx, child_p, node, 0, NULL));
+ LY_CHECK_GOTO(ret = lys_compile_node(ctx, child_p, node, 0, NULL), done);
}
} else {
LOGINT_RET(ctx->ctx);
}
- return LY_SUCCESS;
+ /* connect any augments */
+ LY_CHECK_GOTO(ret = lys_compile_node_augments(ctx, node), done);
+
+done:
+ return ret;
}
void