From 74e43e61cee90888e756cea6c405df1ce36b5454 Mon Sep 17 00:00:00 2001 From: Laria Carolin Chabowski Date: Sun, 19 Dec 2021 00:28:35 +0100 Subject: [PATCH] Parser: Clean up more things and make sure to not deinit uninitialized data --- src/parser.c | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/parser.c b/src/parser.c index f1a5338..4db248c 100644 --- a/src/parser.c +++ b/src/parser.c @@ -759,9 +759,9 @@ after_mapsto: &pair, 1 )) { - // \mystuff\TODO:destroy pair! + apfl_expr_dict_pair_deinit(&pair); p->error = apfl_error_simple(APFL_ERR_MALLOC_FAILED); - return false; + goto error; } } @@ -790,7 +790,7 @@ error: if (cleanup_value) { fragment_deinit(&value); } - free(dict.items); // \mystuff\TODO:also destroy all items! + apfl_expr_dict_deinit(&dict); return false; } @@ -1278,7 +1278,6 @@ fragment_to_assignable_inner( assert(false); // Should not be reached error: - apfl_expr_assignable_deinit(out); return false; } @@ -1287,10 +1286,20 @@ fragment_to_assignable( apfl_parser_ptr p, bool expand_ok, struct fragment fragment, - struct apfl_expr_assignable *out + struct apfl_expr_assignable *outptr ) { - bool result = fragment_to_assignable_inner(p, expand_ok, &fragment, out); + struct apfl_expr_assignable out = { // Just a value that can be safely deinited + .type = APFL_EXPR_ASSIGNABLE_EXPAND, + .expand = NULL, + }; + + bool result = fragment_to_assignable_inner(p, expand_ok, &fragment, &out); fragment_deinit(&fragment); + if (result) { + *outptr = out; + } else { + apfl_expr_assignable_deinit(&out); + } return result; } @@ -1387,6 +1396,13 @@ parse_body_or_toplevel_finalize( struct partial_assignment_list partial_assignments, struct apfl_expr *out ) { + *out = (struct apfl_expr) { + .type = APFL_EXPR_CONSTANT, + .constant = { + .type = APFL_EXPR_CONST_NIL, + } + }; + if (fragments.len == 0) { if (partial_assignments.len > 0) { p->error = (struct apfl_error) { @@ -1537,7 +1553,6 @@ break_inner: fragment_list_deinit(fragments); // Reset fragment list if (!fragment_to_assignable(p, false, fragment, &cur_partial->lhs)) { - fragment_deinit(&fragment); goto error; } @@ -1584,7 +1599,7 @@ break_inner: } } -error: // \mystuff\TODO:also on other non ok results??? +error: DEINIT_LIST(partial_assignments.items, partial_assignments.len, partial_assignment_deinit); return PF_ERROR; } @@ -1738,13 +1753,21 @@ parse_braces( } error: + apfl_expr_body_deinit(&body); + apfl_expr_params_deinit(¶ms); fragment_list_deinit(&fragments); + DEINIT_LIST(subfuncs, subfuncs_len, apfl_expr_subfunc_deinit); return false; } static enum parse_fragment_result parse_fragment(apfl_parser_ptr p, struct fragment *fragment, bool need, enum parse_fragment_flags flags) { + *fragment = (struct fragment) { // Something we can safely deinit + .type = FRAG_EXPAND, + .expand = NULL, + }; + struct fragment *lhs = NULL; struct fragment *rhs = NULL;