From 5ea55a9f9c245b3d49f79bad1595957700904157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kha=C3=AFs=20COLIN?= Date: Tue, 29 Apr 2025 15:50:38 +0200 Subject: [PATCH] fix(builtin/exit): prevent leak when calling exit in a subprocess --- src/executing/simple_cmd/builtin_cd.c | 8 +++---- src/executing/simple_cmd/builtin_echo.c | 10 ++++----- src/executing/simple_cmd/builtin_env.c | 10 ++++----- src/executing/simple_cmd/builtin_exit.c | 11 +++++----- src/executing/simple_cmd/builtin_export.c | 6 ++--- src/executing/simple_cmd/builtin_invalid.c | 6 ++--- src/executing/simple_cmd/builtin_pwd.c | 10 ++++----- src/executing/simple_cmd/builtin_unset.c | 6 ++--- src/executing/simple_cmd/builtins.c | 15 ++++++------- src/executing/simple_cmd/builtins.h | 22 +++++++++---------- src/executing/simple_cmd/simple_cmd_execute.c | 12 +++++----- test.sh | 7 ++++++ 12 files changed, 65 insertions(+), 58 deletions(-) diff --git a/src/executing/simple_cmd/builtin_cd.c b/src/executing/simple_cmd/builtin_cd.c index 733219a..11f337a 100644 --- a/src/executing/simple_cmd/builtin_cd.c +++ b/src/executing/simple_cmd/builtin_cd.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/31 16:20:17 by khais #+# #+# */ -/* Updated: 2025/04/25 16:07:25 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:41:46 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,7 +47,7 @@ static void chdir_home(t_minishell *app) ft_chdir(home, app); } -t_builtin_type builtin_cd(t_simple_cmd *cmd, t_minishell *app) +t_subprocess builtin_cd(t_simple_cmd *cmd, t_minishell *app) { t_worddesc *arg; @@ -55,12 +55,12 @@ t_builtin_type builtin_cd(t_simple_cmd *cmd, t_minishell *app) { ft_dprintf(STDERR_FILENO, "minishell: cd: too many arguments\n"); app->last_return_value = 1; - return (BUILTIN_CD); + return (PARENTPROCESS); } arg = wordlist_get(cmd->words, 1); if (arg == NULL) chdir_home(app); else ft_chdir(arg->word, app); - return (BUILTIN_CD); + return (PARENTPROCESS); } diff --git a/src/executing/simple_cmd/builtin_echo.c b/src/executing/simple_cmd/builtin_echo.c index 080dee3..1a49894 100644 --- a/src/executing/simple_cmd/builtin_echo.c +++ b/src/executing/simple_cmd/builtin_echo.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/03 13:59:13 by khais #+# #+# */ -/* Updated: 2025/04/14 11:52:37 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:43:22 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,14 +43,14 @@ static bool should_print_newline(t_wordlist **arg) return (print_newline); } -static t_builtin_type write_error(t_minishell *app) +static t_subprocess write_error(t_minishell *app) { app->last_return_value = 1; perror("minishell: echo: write error"); - return (BUILTIN_ECHO); + return (PARENTPROCESS); } -t_builtin_type builtin_echo(t_simple_cmd *cmd, t_minishell *app) +t_subprocess builtin_echo(t_simple_cmd *cmd, t_minishell *app) { t_wordlist *arg; bool print_newline; @@ -74,5 +74,5 @@ t_builtin_type builtin_echo(t_simple_cmd *cmd, t_minishell *app) return (write_error(app)); } app->last_return_value = 0; - return (BUILTIN_ECHO); + return (PARENTPROCESS); } diff --git a/src/executing/simple_cmd/builtin_env.c b/src/executing/simple_cmd/builtin_env.c index 605f484..e4cfcc9 100644 --- a/src/executing/simple_cmd/builtin_env.c +++ b/src/executing/simple_cmd/builtin_env.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/02 19:35:52 by khais #+# #+# */ -/* Updated: 2025/04/14 11:58:15 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:40:55 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,14 +14,14 @@ #include "libft.h" #include -static t_builtin_type write_error(t_minishell *app) +static t_subprocess write_error(t_minishell *app) { app->last_return_value = 125; perror("minishell: env: write error"); - return (BUILTIN_ENV); + return (PARENTPROCESS); } -t_builtin_type builtin_env(t_simple_cmd *cmd, t_minishell *app) +t_subprocess builtin_env(t_simple_cmd *cmd, t_minishell *app) { t_env *env; @@ -35,5 +35,5 @@ t_builtin_type builtin_env(t_simple_cmd *cmd, t_minishell *app) env = env->next; } app->last_return_value = 0; - return (BUILTIN_ENV); + return (PARENTPROCESS); } diff --git a/src/executing/simple_cmd/builtin_exit.c b/src/executing/simple_cmd/builtin_exit.c index 3979422..4ad864a 100644 --- a/src/executing/simple_cmd/builtin_exit.c +++ b/src/executing/simple_cmd/builtin_exit.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/01 18:17:56 by khais #+# #+# */ -/* Updated: 2025/04/16 16:40:57 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:37:56 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -56,7 +56,7 @@ static int numeric_arg_required(char *arg) return (2); } -t_builtin_type builtin_exit(t_simple_cmd *cmd, t_minishell *app) +t_subprocess builtin_exit(t_simple_cmd *cmd, t_minishell *app) { int status; bool ok; @@ -71,10 +71,9 @@ t_builtin_type builtin_exit(t_simple_cmd *cmd, t_minishell *app) { ft_dprintf(STDERR_FILENO, "minishell: exit: too many arguments\n"); app->last_return_value = 1; - return (BUILTIN_EXIT); + return (PARENTPROCESS); } } - simple_cmd_destroy(cmd); - env_destroy(app->env); - exit(status); + app->last_return_value = status; + return (SUBPROCESS); } diff --git a/src/executing/simple_cmd/builtin_export.c b/src/executing/simple_cmd/builtin_export.c index ab4efeb..c80388c 100644 --- a/src/executing/simple_cmd/builtin_export.c +++ b/src/executing/simple_cmd/builtin_export.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/01 14:00:32 by khais #+# #+# */ -/* Updated: 2025/04/18 10:09:09 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:41:24 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -49,7 +49,7 @@ static void single_export(char *arg, t_minishell *app) } } -t_builtin_type builtin_export(t_simple_cmd *cmd, t_minishell *app) +t_subprocess builtin_export(t_simple_cmd *cmd, t_minishell *app) { int i; t_worddesc *arg; @@ -62,5 +62,5 @@ t_builtin_type builtin_export(t_simple_cmd *cmd, t_minishell *app) single_export(arg->word, app); arg = wordlist_get(cmd->words, i++); } - return (BUILTIN_EXPORT); + return (PARENTPROCESS); } diff --git a/src/executing/simple_cmd/builtin_invalid.c b/src/executing/simple_cmd/builtin_invalid.c index dd92c74..04b9cf9 100644 --- a/src/executing/simple_cmd/builtin_invalid.c +++ b/src/executing/simple_cmd/builtin_invalid.c @@ -6,15 +6,15 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/31 14:17:14 by khais #+# #+# */ -/* Updated: 2025/03/31 14:17:42 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:41:58 by khais ### ########.fr */ /* */ /* ************************************************************************** */ #include "builtins.h" -t_builtin_type builtin_invalid(t_simple_cmd *cmd, t_minishell *app) +t_subprocess builtin_invalid(t_simple_cmd *cmd, t_minishell *app) { (void)cmd; (void)app; - return (BUILTIN_INVALID); + return (PARENTPROCESS); } diff --git a/src/executing/simple_cmd/builtin_pwd.c b/src/executing/simple_cmd/builtin_pwd.c index fdd043d..eb5d497 100644 --- a/src/executing/simple_cmd/builtin_pwd.c +++ b/src/executing/simple_cmd/builtin_pwd.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/31 14:21:52 by khais #+# #+# */ -/* Updated: 2025/04/14 11:53:17 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:42:51 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,14 +38,14 @@ static char *get_current_dir(void) return (path); } -static t_builtin_type write_error(t_minishell *app) +static t_subprocess write_error(t_minishell *app) { app->last_return_value = 1; perror("minishell: pwd: write error"); - return (BUILTIN_PWD); + return (PARENTPROCESS); } -t_builtin_type builtin_pwd(t_simple_cmd *cmd, t_minishell *app) +t_subprocess builtin_pwd(t_simple_cmd *cmd, t_minishell *app) { char *path; @@ -63,5 +63,5 @@ t_builtin_type builtin_pwd(t_simple_cmd *cmd, t_minishell *app) free(path); app->last_return_value = 0; } - return (BUILTIN_PWD); + return (PARENTPROCESS); } diff --git a/src/executing/simple_cmd/builtin_unset.c b/src/executing/simple_cmd/builtin_unset.c index fb246cd..f508683 100644 --- a/src/executing/simple_cmd/builtin_unset.c +++ b/src/executing/simple_cmd/builtin_unset.c @@ -6,14 +6,14 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/03 14:35:53 by khais #+# #+# */ -/* Updated: 2025/04/03 14:39:45 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:40:24 by khais ### ########.fr */ /* */ /* ************************************************************************** */ #include "builtins.h" #include "../../env/env_manip.h" -t_builtin_type builtin_unset(t_simple_cmd *cmd, t_minishell *app) +t_subprocess builtin_unset(t_simple_cmd *cmd, t_minishell *app) { t_wordlist *arg; @@ -24,5 +24,5 @@ t_builtin_type builtin_unset(t_simple_cmd *cmd, t_minishell *app) arg = arg->next; } app->last_return_value = 0; - return (BUILTIN_UNSET); + return (PARENTPROCESS); } diff --git a/src/executing/simple_cmd/builtins.c b/src/executing/simple_cmd/builtins.c index e0e7fbc..789184f 100644 --- a/src/executing/simple_cmd/builtins.c +++ b/src/executing/simple_cmd/builtins.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/01 16:37:21 by khais #+# #+# */ -/* Updated: 2025/04/28 14:40:19 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:54:21 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,11 +39,11 @@ t_builtin_type get_builtin(t_simple_cmd *cmd) return (BUILTIN_INVALID); } -t_builtin_type execute_builtin(t_simple_cmd *cmd, t_minishell *app, - t_std_fds *fds) +t_subprocess execute_builtin(t_simple_cmd *cmd, t_minishell *app, + t_std_fds *fds, t_builtin_type type) { - t_builtin_type type; - static t_builtin_type (*builtins[])(t_simple_cmd *, t_minishell *) = { + t_subprocess retvalue; + static t_subprocess (*builtins[])(t_simple_cmd *, t_minishell *) = { [BUILTIN_INVALID] = builtin_invalid, [BUILTIN_PWD] = builtin_pwd, [BUILTIN_CD] = builtin_cd, @@ -54,9 +54,8 @@ t_builtin_type execute_builtin(t_simple_cmd *cmd, t_minishell *app, [BUILTIN_UNSET] = builtin_unset, }; - type = get_builtin(cmd); - builtins[type](cmd, app); + retvalue = builtins[type](cmd, app); if (type != BUILTIN_INVALID) restore_std_fds(fds); - return (type); + return (retvalue); } diff --git a/src/executing/simple_cmd/builtins.h b/src/executing/simple_cmd/builtins.h index 93309f7..e18455b 100644 --- a/src/executing/simple_cmd/builtins.h +++ b/src/executing/simple_cmd/builtins.h @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/31 14:16:13 by khais #+# #+# */ -/* Updated: 2025/04/28 12:48:00 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:46:28 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,17 +15,17 @@ # include "simple_cmd_execute.h" -t_builtin_type builtin_invalid(t_simple_cmd *cmd, t_minishell *app); -t_builtin_type builtin_pwd(t_simple_cmd *cmd, t_minishell *app); -t_builtin_type builtin_cd(t_simple_cmd *cmd, t_minishell *app); -t_builtin_type builtin_export(t_simple_cmd *cmd, t_minishell *app); -t_builtin_type builtin_exit(t_simple_cmd *cmd, t_minishell *app); -t_builtin_type builtin_echo(t_simple_cmd *cmd, t_minishell *app); -t_builtin_type builtin_env(t_simple_cmd *cmd, t_minishell *app); -t_builtin_type builtin_unset(t_simple_cmd *cmd, t_minishell *app); +t_subprocess builtin_invalid(t_simple_cmd *cmd, t_minishell *app); +t_subprocess builtin_pwd(t_simple_cmd *cmd, t_minishell *app); +t_subprocess builtin_cd(t_simple_cmd *cmd, t_minishell *app); +t_subprocess builtin_export(t_simple_cmd *cmd, t_minishell *app); +t_subprocess builtin_exit(t_simple_cmd *cmd, t_minishell *app); +t_subprocess builtin_echo(t_simple_cmd *cmd, t_minishell *app); +t_subprocess builtin_env(t_simple_cmd *cmd, t_minishell *app); +t_subprocess builtin_unset(t_simple_cmd *cmd, t_minishell *app); t_builtin_type get_builtin(t_simple_cmd *cmd); -t_builtin_type execute_builtin(t_simple_cmd *cmd, t_minishell *app, - t_std_fds *fds); +t_subprocess execute_builtin(t_simple_cmd *cmd, t_minishell *app, + t_std_fds *fds, t_builtin_type type); #endif // BUILTINS_H diff --git a/src/executing/simple_cmd/simple_cmd_execute.c b/src/executing/simple_cmd/simple_cmd_execute.c index 5e6de5b..b540a5d 100644 --- a/src/executing/simple_cmd/simple_cmd_execute.c +++ b/src/executing/simple_cmd/simple_cmd_execute.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/27 16:21:56 by khais #+# #+# */ -/* Updated: 2025/04/29 15:10:35 by khais ### ########.fr */ +/* Updated: 2025/04/29 15:47:27 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -97,7 +97,8 @@ static t_subprocess exec_external_cmd(t_simple_cmd *cmd, t_minishell *app, t_subprocess simple_cmd_execute(t_simple_cmd *cmd, t_minishell *app) { - t_std_fds fds; + t_std_fds fds; + t_builtin_type type; if (cmd == NULL) return (PARENTPROCESS); @@ -111,7 +112,8 @@ t_subprocess simple_cmd_execute(t_simple_cmd *cmd, t_minishell *app) simple_cmd_execute_debug(cmd, app); if (handle_redirections(cmd->redirections, app, &fds) == NULL) return (PARENTPROCESS); - if (execute_builtin(cmd, app, &fds) == BUILTIN_INVALID) - return (exec_external_cmd(cmd, app, &fds)); - return (PARENTPROCESS); + type = get_builtin(cmd); + if (type != BUILTIN_INVALID) + return (execute_builtin(cmd, app, &fds, type)); + return (exec_external_cmd(cmd, app, &fds)); } diff --git a/test.sh b/test.sh index 13555bc..8b355e3 100755 --- a/test.sh +++ b/test.sh @@ -1595,4 +1595,11 @@ minishell: warning: here-document delimited by end-of-file (wanted `'hola'') test EOF +when_run <