From f4fd0272936a3b8f290915cf182e0a3c97713e3e Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Sat, 10 Aug 2024 18:13:13 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=94=A8=E3=80=8D=20fix:=20heredoc?= =?UTF-8?q?=20leak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/parsing.h | 3 ++- libft/src/linked_lists/ft_lstnew.c | 4 ++- src/exec/heredoc.c | 5 +++- src/exec/heredoc_utils.c | 5 +++- src/main.c | 2 +- src/parsing/check_error/check_redir.c | 4 +-- src/parsing/ft_ischevron.c | 17 ++++++++++++ src/parsing/split_argv.c | 37 +++++++++++++++------------ src/parsing/tokenizer/__to_cmd.c | 8 +----- src/parsing/tokenizer/tokenizer.c | 10 ++++++-- src/utils/get.c | 11 +++++++- src/utils/get_to_free.c | 20 +++++++-------- 12 files changed, 82 insertions(+), 44 deletions(-) create mode 100644 src/parsing/ft_ischevron.c diff --git a/include/parsing.h b/include/parsing.h index f794833..bdb7449 100644 --- a/include/parsing.h +++ b/include/parsing.h @@ -6,7 +6,7 @@ /* By: mmoussou +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/10 01:14:10 by adjoly #+# #+# */ -/* Updated: 2024/08/06 15:18:19 by adjoly ### ########.fr */ +/* Updated: 2024/08/10 12:43:36 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,8 @@ #include #include "minishell.h" +t_list **get_list2(t_list **list); + int __open_fd_here(char *path, int mode) { int fd; @@ -67,6 +69,7 @@ void __heredoc_sig(int code) (void)code; ft_envclear(get_env(NULL), free); ft_lstclear(get_list(NULL), free); + ft_lstclear(get_list2(NULL), free_cmd); ft_free("a", (char ***)get_void(NULL)); close(get_fd_heredoc(-1)); close(get_fd_heredoc(-1)); diff --git a/src/main.c b/src/main.c index bbeb2a4..31a1631 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: mmoussou +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/09 16:32:21 by adjoly #+# #+# */ -/* Updated: 2024/08/05 22:02:00 by adjoly ### ########.fr */ +/* Updated: 2024/08/10 17:44:56 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,7 +23,7 @@ bool check_redir(t_list *list) while (tmp) { redir = (t_redir *)tmp->content; - if (redir->fd < 0) + if (redir->fd < 0 && redir->fd != -2) return (send_error_parsing(ERROR_NO_FILE)); tmp = tmp->next; } diff --git a/src/parsing/ft_ischevron.c b/src/parsing/ft_ischevron.c new file mode 100644 index 0000000..5062f71 --- /dev/null +++ b/src/parsing/ft_ischevron.c @@ -0,0 +1,17 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ischevron.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/10 17:53:56 by adjoly #+# #+# */ +/* Updated: 2024/08/10 17:53:59 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_ischevron(int c) +{ + return (c == '<' || c == '>'); +} + diff --git a/src/parsing/split_argv.c b/src/parsing/split_argv.c index c12d4d3..2b2ab02 100644 --- a/src/parsing/split_argv.c +++ b/src/parsing/split_argv.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/05 13:48:57 by adjoly #+# #+# */ -/* Updated: 2024/08/06 17:23:12 by adjoly ### ########.fr */ +/* Updated: 2024/08/10 17:54:35 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,11 +14,6 @@ #include "parsing.h" #include -int ft_ischevron(int c) -{ - return (c == '<' || c == '>'); -} - size_t __get_len_arg(char *s) { char *tmp; @@ -69,21 +64,12 @@ size_t __count_args(char *s) return (i); } -char **split_argv(char *readline) +char **__split_argv(char *tmp) { char **argv; char **tmp_av; - char *tmp; - tmp = readline; - if (!readline) - return (NULL); - if (!*readline) - { - free(readline); - return (NULL); - } - argv = ft_calloc(__count_args(readline) + 1, sizeof(char *)); + argv = ft_calloc(__count_args(tmp) + 1, sizeof(char *)); tmp_av = argv; while (*tmp) { @@ -97,6 +83,23 @@ char **split_argv(char *readline) } } *tmp_av = NULL; + return (argv); +} + +char **split_argv(char *readline) +{ + char **argv; + char *tmp; + + if (!readline) + return (NULL); + if (!*readline) + { + free(readline); + return (NULL); + } + tmp = readline; + argv = __split_argv(tmp); free(readline); return (argv); } diff --git a/src/parsing/tokenizer/__to_cmd.c b/src/parsing/tokenizer/__to_cmd.c index 63ffcd8..92664ab 100644 --- a/src/parsing/tokenizer/__to_cmd.c +++ b/src/parsing/tokenizer/__to_cmd.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/05 14:19:35 by adjoly #+# #+# */ -/* Updated: 2024/08/06 17:25:14 by adjoly ### ########.fr */ +/* Updated: 2024/08/10 17:47:07 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,11 +38,6 @@ t_list *__get_redir(char **content) { tmp = ft_lstnew(__open_heredoc(*(content + 1))); ft_lstadd_back(&list, tmp); - if (((t_redir *)(tmp->content))->sign == ERROR) - { - ft_lstclear(&list, free_redir); - return (NULL); - } } else if (sign != ERROR) ft_lstadd_back(&list, ft_lstnew(__to_redir(*(content + 1), sign))); @@ -83,6 +78,5 @@ t_cmd *__to_cmd(char **content) free(content); cmd->cmd = ft_strdup(cmd->argv[0]); ft_lstclear(&redir, free); - printcmd(cmd); return (cmd); } diff --git a/src/parsing/tokenizer/tokenizer.c b/src/parsing/tokenizer/tokenizer.c index 5389c7a..eda5d8f 100644 --- a/src/parsing/tokenizer/tokenizer.c +++ b/src/parsing/tokenizer/tokenizer.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/18 20:13:50 by adjoly #+# #+# */ -/* Updated: 2024/08/06 17:05:44 by adjoly ### ########.fr */ +/* Updated: 2024/08/10 17:46:54 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,9 +14,11 @@ #include "minishell.h" #include +t_list **get_list2(t_list **list); + void *clear_all(t_list *cmd, t_list *piped) { - ft_lstclear(&cmd, free); + ft_lstclear(&cmd, free_cmd); ft_lstclear(&piped, free); return (NULL); } @@ -38,6 +40,10 @@ t_list *tokenizer(char *readline, t_env *env) ft_lstadd_back(&cmd, ft_lstnew(__to_cmd(split_argv(env_var_replace(tmp->content, env))))); + if (((t_cmd *)ft_lstlast(cmd)->content)->infile == -2) + return (clear_all(cmd, piped)); + if (!cmd->next) + get_list2(&cmd); if (!ft_lstlast(cmd)->content) return (clear_all(cmd, piped)); tmp = tmp->next; diff --git a/src/utils/get.c b/src/utils/get.c index 264c1fa..0121cb7 100644 --- a/src/utils/get.c +++ b/src/utils/get.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/18 13:08:56 by adjoly #+# #+# */ -/* Updated: 2024/07/18 13:09:15 by adjoly ### ########.fr */ +/* Updated: 2024/08/10 17:53:22 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,3 +20,12 @@ char **get_rl(char **rl) ret = rl; return (ret); } + +int get_fd_heredoc(int in) +{ + static int fd; + + if (in != -1) + fd = in; + return (fd); +} diff --git a/src/utils/get_to_free.c b/src/utils/get_to_free.c index ebb0b89..cf4cbdb 100644 --- a/src/utils/get_to_free.c +++ b/src/utils/get_to_free.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/09 17:24:15 by adjoly #+# #+# */ -/* Updated: 2024/08/05 23:11:27 by adjoly ### ########.fr */ +/* Updated: 2024/08/10 17:53:25 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,6 +31,15 @@ t_list **get_list(t_list **list) return (ret); } +t_list **get_list2(t_list **list) +{ + static t_list **ret; + + if (list) + ret = list; + return (ret); +} + void *get_void(void *in) { static void *ret; @@ -55,12 +64,3 @@ int get_exit_code(int in) exit_code += 256; return (exit_code); } - -int get_fd_heredoc(int in) -{ - static int fd; - - if (in != -1) - fd = in; - return (fd); -}