oplist: Plug memory leaks occurring when parsing fails
diff --git a/src/oplist.c b/src/oplist.c
index fa6977a..b3b782f 100644
--- a/src/oplist.c
+++ b/src/oplist.c
@@ -677,9 +677,13 @@
                 ctx->pos++;
             }
             if (ctx->err) {
+                byte_array_free(bytes);
+                plist_free_data(data);
                 goto err_out;
             }
             if (*ctx->pos != '>') {
+                byte_array_free(bytes);
+                plist_free_data(data);
                 PLIST_OSTEP_ERR("Missing terminating '>' at offset %ld\n", ctx->pos - ctx->start);
                 ctx->err++;
                 goto err_out;
@@ -707,6 +711,7 @@
                 ctx->pos++;
             }
             if (*ctx->pos != c) {
+                plist_free_data(data);
                 PLIST_OSTEP_ERR("Missing closing quote (%c) at offset %ld\n", c, ctx->pos - ctx->start);
                 ctx->err++;
                 goto err_out;
@@ -807,6 +812,7 @@
                 parse_skip_ws(ctx);
                 break;
             } else {
+                plist_free_data(data);
                 PLIST_OSTEP_ERR("Unexpected character when parsing unquoted string at offset %ld\n", ctx->pos - ctx->start);
                 ctx->err++;
                 break;
@@ -817,6 +823,7 @@
 
 err_out:
     if (ctx->err) {
+        plist_free(subnode);
         plist_free(*plist);
         *plist = NULL;
         return PLIST_ERR_PARSE;