xml parser BUGFIX double free
value was freed but counter wasn't decremented and lyxml_context_clear then caused double free error
diff --git a/src/xml.c b/src/xml.c
index b5af06f..23c0307 100644
--- a/src/xml.c
+++ b/src/xml.c
@@ -703,7 +703,7 @@
e = (struct lyxml_elem*)context->elements.objs[context->elements.count - 1];
LY_CHECK_ERR_GOTO(e->prefix_len != prefix_len || e->name_len != name_len
|| (prefix_len && strncmp(prefix, e->prefix, e->prefix_len)) || strncmp(name, e->name, e->name_len),
- free(e); LOGVAL(ctx, LY_VLOG_LINE, &fakecontext.line, LYVE_SYNTAX,
+ free(e); --context->elements.count; LOGVAL(ctx, LY_VLOG_LINE, &fakecontext.line, LYVE_SYNTAX,
"Opening and closing elements tag missmatch (\"%.*s\").", name_len, name),
error);
/* opening and closing element tags matches */
diff --git a/tests/src/test_xml.c b/tests/src/test_xml.c
index ebca0da..75819b7 100644
--- a/tests/src/test_xml.c
+++ b/tests/src/test_xml.c
@@ -224,6 +224,15 @@
logbuf_assert("Mixed XML content is not allowed (text <b>). Line number 1.");
lyxml_context_clear(&ctx);
+ /* tag missmatch */
+ str = "<a>text</b>";
+ assert_int_equal(LY_SUCCESS, lyxml_get_element(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
+ assert_string_equal("text</b>", str);
+ assert_int_equal(LYXML_ELEM_CONTENT, ctx.status);
+ assert_int_equal(LY_EVALID, lyxml_get_string(&ctx, &str, &buf, &buf_len, &out, &len, &dynamic));
+ logbuf_assert("Opening and closing elements tag missmatch (\"b\"). Line number 1.");
+ lyxml_context_clear(&ctx);
+
}
static void