fix: heap-use-after-free and memory leaks on erorr cases

This commit is contained in:
matteo 2026-01-30 12:21:29 +01:00 committed by Matteo Flebus
parent f0b39535fb
commit 5740195cb3
4 changed files with 18 additions and 11 deletions

View file

@ -66,8 +66,11 @@ static int main_loop(struct lexer_context *ctx, struct args_options *options,
if (command_ast == NULL) if (command_ast == NULL)
return err_input(&vars); return err_input(&vars);
// === free
ast_free(&command_ast); ast_free(&command_ast);
parser_close(); parser_close();
hash_map_free(&vars);
return return_code; return return_code;
} }
@ -120,9 +123,5 @@ int main(int argc, char **argv)
return_code = main_loop(&ctx, &options, vars); return_code = main_loop(&ctx, &options, vars);
// === free
hash_map_free(&vars);
return return_code; return return_code;
} }

View file

@ -238,16 +238,20 @@ struct ast *parse_input(struct lexer_context *ctx)
} }
struct ast *ast = parse_list(ctx); struct ast *ast = parse_list(ctx);
if (ast == NULL)
return NULL;
token = PEEK_TOKEN(); token = PEEK_TOKEN();
if (token->type == TOKEN_NEWLINE || token->type == TOKEN_EOF)
if (ast == NULL)
{ {
if (token->type == TOKEN_NEWLINE) if (token != NULL && token->type == TOKEN_EOF)
{ {
POP_TOKEN(); POP_TOKEN();
} }
return NULL;
}
if (token->type == TOKEN_NEWLINE || token->type == TOKEN_EOF)
{
POP_TOKEN();
return ast; return ast;
} }

View file

@ -329,12 +329,13 @@ struct ast *parse_if_rule(struct lexer_context *ctx)
struct ast *condition_content = parse_compound_list(ctx); struct ast *condition_content = parse_compound_list(ctx);
// Then keyword // Then keyword
token = POP_TOKEN(); token = PEEK_TOKEN();
if (token->type != TOKEN_THEN) if (token->type != TOKEN_THEN)
{ {
perror("Expected the 'then' keyword but token has different type"); perror("Expected the 'then' keyword but token has different type");
return err_if_rule(&condition_content, NULL, NULL); return err_if_rule(&condition_content, NULL, NULL);
} }
POP_TOKEN();
// Then content // Then content
struct ast *then_content = parse_compound_list(ctx); struct ast *then_content = parse_compound_list(ctx);
@ -344,6 +345,7 @@ struct ast *parse_if_rule(struct lexer_context *ctx)
} }
struct ast *else_content = NULL; struct ast *else_content = NULL;
token = PEEK_TOKEN();
// Eventual else/elif clause(s) // Eventual else/elif clause(s)
if (is_first(*token, RULE_ELSE_CLAUSE)) if (is_first(*token, RULE_ELSE_CLAUSE))
{ {
@ -355,12 +357,13 @@ struct ast *parse_if_rule(struct lexer_context *ctx)
} }
// Fi keyword // Fi keyword
token = POP_TOKEN(); token = PEEK_TOKEN();
if (token->type != TOKEN_FI) if (token->type != TOKEN_FI)
{ {
perror("Expected the 'fi' keyword but token has different type"); perror("Expected the 'fi' keyword but token has different type");
return err_if_rule(&condition_content, &then_content, &else_content); return err_if_rule(&condition_content, &then_content, &else_content);
} }
POP_TOKEN();
// Result // Result
struct ast *result = struct ast *result =

View file

@ -117,6 +117,7 @@ void hash_map_free(struct hash_map **hash_map)
free((*hash_map)->data); free((*hash_map)->data);
free(*hash_map); free(*hash_map);
} }
*hash_map = NULL;
} }
void hash_map_foreach(struct hash_map *hash_map, void hash_map_foreach(struct hash_map *hash_map,