parser xml BUGFIX full xml context backup
... including opened elements and namespaces.
Fixes cesnet/netopeer2#930
diff --git a/src/parser_xml.c b/src/parser_xml.c
index 570d6b3..a827ab7 100644
--- a/src/parser_xml.c
+++ b/src/parser_xml.c
@@ -330,10 +330,7 @@
lydxml_data_check_opaq(struct lyd_xml_ctx *lydctx, const struct lysc_node **snode)
{
LY_ERR ret = LY_SUCCESS;
- enum LYXML_PARSER_STATUS prev_status;
- const char *prev_current, *pname, *pprefix;
- size_t pprefix_len, pname_len;
- struct lyxml_ctx *xmlctx = lydctx->xmlctx;
+ struct lyxml_ctx *xmlctx = lydctx->xmlctx, pxmlctx;
if (!(lydctx->parse_opts & LYD_PARSE_OPAQ)) {
/* only checks specific to opaque nodes */
@@ -345,17 +342,10 @@
return LY_SUCCESS;
}
+ assert(xmlctx->elements.count);
+
/* backup parser */
- prev_status = xmlctx->status;
- pprefix = xmlctx->prefix;
- pprefix_len = xmlctx->prefix_len;
- pname = xmlctx->name;
- pname_len = xmlctx->name_len;
- prev_current = xmlctx->in->current;
- if ((xmlctx->status == LYXML_ELEM_CONTENT) && xmlctx->dynamic) {
- /* it was backed up, do not free */
- xmlctx->dynamic = 0;
- }
+ LY_CHECK_RET(lyxml_ctx_backup(xmlctx, &pxmlctx));
/* skip attributes */
while (xmlctx->status == LYXML_ATTRIBUTE) {
@@ -386,16 +376,7 @@
restore:
/* restore parser */
- if (xmlctx->dynamic) {
- free((char *)xmlctx->value);
- }
- xmlctx->status = prev_status;
- xmlctx->prefix = pprefix;
- xmlctx->prefix_len = pprefix_len;
- xmlctx->name = pname;
- xmlctx->name_len = pname_len;
- xmlctx->in->current = prev_current;
-
+ lyxml_ctx_restore(xmlctx, &pxmlctx);
return ret;
}
@@ -537,6 +518,10 @@
LY_CHECK_GOTO(ret, error);
}
+ /* get NS again, it may have been backed up and restored */
+ ns = lyxml_ns_get(&xmlctx->ns, prefix, prefix_len);
+ assert(ns);
+
/* create node */
ret = lyd_create_opaq(ctx, name, name_len, prefix, prefix_len, ns->uri, strlen(ns->uri), xmlctx->value,
xmlctx->value_len, &xmlctx->dynamic, format, val_prefix_data, LYD_HINT_DATA, &node);