data parsers BUGFIX memory leaks
diff --git a/src/tree_data.c b/src/tree_data.c
index 1159387..1b59493 100644
--- a/src/tree_data.c
+++ b/src/tree_data.c
@@ -706,13 +706,13 @@
     }
 
     opaq = calloc(1, sizeof *opaq);
-    LY_CHECK_ERR_RET(!opaq, LOGMEM(ctx), LY_EMEM);
+    LY_CHECK_ERR_RET(!opaq, LOGMEM(ctx); ly_free_val_prefs(ctx, val_prefs), LY_EMEM);
 
     opaq->prev = (struct lyd_node *)opaq;
-
+    opaq->val_prefs = val_prefs;
+    opaq->format = format;
     LY_CHECK_GOTO(ret = lydict_insert(ctx, name, name_len, &opaq->name), finish);
 
-    opaq->format = format;
     if (pref_len) {
         LY_CHECK_GOTO(ret = lydict_insert(ctx, prefix, pref_len, &opaq->prefix.id), finish);
     }
@@ -720,7 +720,6 @@
         LY_CHECK_GOTO(ret = lydict_insert(ctx, module_key, module_key_len, &opaq->prefix.module_ns), finish);
     }
 
-    opaq->val_prefs = val_prefs;
     if (dynamic && *dynamic) {
         LY_CHECK_GOTO(ret = lydict_insert_zc(ctx, (char *)value, &opaq->value), finish);
         *dynamic = 0;
@@ -2218,7 +2217,11 @@
     }
 
     at = calloc(1, sizeof *at);
-    LY_CHECK_ERR_RET(!at, LOGMEM(ctx), LY_EMEM);
+    LY_CHECK_ERR_RET(!at, LOGMEM(ctx); ly_free_val_prefs(ctx, val_prefs), LY_EMEM);
+    at->hint = value_hint;
+    at->format = format;
+    at->val_prefs = val_prefs;
+
     LY_CHECK_GOTO(ret = lydict_insert(ctx, name, name_len, &at->name), finish);
     if (dynamic && *dynamic) {
         ret = lydict_insert_zc(ctx, (char *)value, &at->value);
@@ -2228,9 +2231,6 @@
         LY_CHECK_GOTO(ret = lydict_insert(ctx, value, value_len, &at->value), finish);
     }
 
-    at->hint = value_hint;
-    at->format = format;
-    at->val_prefs = val_prefs;
     if (prefix_len) {
         LY_CHECK_GOTO(ret = lydict_insert(ctx, prefix, prefix_len, &at->prefix.id), finish);
     }