From 73afc986993843aadea16c78bb180f7d80966c9a Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Tue, 15 Jan 2013 14:28:15 +0100 Subject: [PATCH] fix: on error it was possible that leaveblock() is called after the function's already been deleted --- parser.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/parser.c b/parser.c index efcacce..ecabe72 100644 --- a/parser.c +++ b/parser.c @@ -4010,6 +4010,14 @@ static bool parse_function_body(parser_t *parser, ast_value *var) } } + func = ast_function_new(ast_ctx(var), var->name, var); + if (!func) { + parseerror(parser, "failed to allocate function for `%s`", var->name); + ast_block_delete(block); + goto enderr; + } + vec_push(parser->functions, func); + parser_enterblock(parser); for (parami = 0; parami < vec_size(var->expression.params); ++parami) { @@ -4026,7 +4034,7 @@ static bool parse_function_body(parser_t *parser, ast_value *var) if (!create_vector_members(param, me)) { ast_block_delete(block); - return false; + goto enderrfn; } for (e = 0; e < 3; ++e) { @@ -4035,14 +4043,6 @@ static bool parse_function_body(parser_t *parser, ast_value *var) } } - func = ast_function_new(ast_ctx(var), var->name, var); - if (!func) { - parseerror(parser, "failed to allocate function for `%s`", var->name); - ast_block_delete(block); - goto enderr; - } - vec_push(parser->functions, func); - if (var->argcounter) { ast_value *argc = ast_value_new(ast_ctx(var), var->argcounter, TYPE_FLOAT); parser_addlocal(parser, argc->name, (ast_expression*)argc); @@ -4093,12 +4093,12 @@ static bool parse_function_body(parser_t *parser, ast_value *var) return retval; enderrfn: + (void)!parser_leaveblock(parser); vec_pop(parser->functions); ast_function_delete(func); var->constval.vfunc = NULL; enderr: - (void)!parser_leaveblock(parser); parser->function = old; return false; } -- 2.39.2