fix: heap-use-after-free and memory leaks on erorr cases
This commit is contained in:
parent
5784f557b8
commit
3fa7b97282
4 changed files with 18 additions and 11 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 =
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue