From 3be296994666547ee53af0cd8b3a38f963e49b83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kha=C3=AFs=20COLIN?= Date: Wed, 16 Apr 2025 18:19:03 +0200 Subject: [PATCH] fix(parsing/simple_cmd): leak when invalid redirection after word in simple_cmd --- src/parser/simple_cmd/simple_cmd_parse.c | 18 +++++++++++++++--- test.sh | 7 +++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/parser/simple_cmd/simple_cmd_parse.c b/src/parser/simple_cmd/simple_cmd_parse.c index f98d83c..9714d4a 100644 --- a/src/parser/simple_cmd/simple_cmd_parse.c +++ b/src/parser/simple_cmd/simple_cmd_parse.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 10:38:47 by khais #+# #+# */ -/* Updated: 2025/04/16 15:26:54 by khais ### ########.fr */ +/* Updated: 2025/04/16 18:20:39 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,10 +17,9 @@ #include "../cmd/cmd_destroy.h" #include "../cmd_parsing.h" -t_cmd *minishell_simple_cmd_parse(t_minishell *app, t_wordlist **tokens) +static t_cmd *simple_cmd_create(void) { t_cmd *simple; - t_redirect *redir; simple = cmd_create(FT_SIMPLE); if (simple == NULL) @@ -28,6 +27,17 @@ t_cmd *minishell_simple_cmd_parse(t_minishell *app, t_wordlist **tokens) simple->value.simple = ft_calloc(1, sizeof(t_simple_cmd)); if (simple->value.simple == NULL) return (ft_errno(FT_ENOMEM), free(simple), NULL); + return (simple); +} + +t_cmd *minishell_simple_cmd_parse(t_minishell *app, t_wordlist **tokens) +{ + t_cmd *simple; + t_redirect *redir; + + simple = simple_cmd_create(); + if (simple == NULL) + return (NULL); redir = minishell_redirect_parse(app, tokens); t_redirect_add_back(&simple->value.simple->redirections, redir); if (ft_errno_get() != FT_ESUCCESS) @@ -39,6 +49,8 @@ t_cmd *minishell_simple_cmd_parse(t_minishell *app, t_wordlist **tokens) if (!simple->value.simple->words) return (ft_errno(FT_EERRNO), cmd_destroy(simple), NULL); redir = minishell_redirect_parse(app, tokens); + if (redir == NULL && ft_errno_get() != FT_ESUCCESS) + return (cmd_destroy(simple), ft_errno(FT_EERRNO), NULL); t_redirect_add_back(&simple->value.simple->redirections, redir); } if (!simple->value.simple->words) diff --git a/test.sh b/test.sh index 0f0d8b4..06d465a 100755 --- a/test.sh +++ b/test.sh @@ -681,4 +681,11 @@ expecting < +EOF +expecting <<"EOF" +minishell: syntax error near unexpected token `>' +EOF + finalize