From 0f2040cb9f526beba2495f72fb7be3bdaf6582a8 Mon Sep 17 00:00:00 2001 From: whaffman Date: Sun, 2 Mar 2025 22:08:37 +0100 Subject: [PATCH] make ft_split_safe and environment safe --- inc/minishell.h | 6 +-- inc/utils.h | 4 +- sources.mk | 25 ++++++------ src/builtin/builtin_export.c | 8 ++-- src/environment/environment_free_list.c | 4 +- src/environment/environment_parse.c | 6 +-- src/environment/environment_print.c | 4 +- src/executor/executor_absolute_path.c | 4 +- src/utils/ft_free_arr_safe.c | 26 ++++++++++++ src/utils/ft_split_safe.c | 53 +++++++++++++++++++++++++ 10 files changed, 112 insertions(+), 28 deletions(-) create mode 100644 src/utils/ft_free_arr_safe.c create mode 100644 src/utils/ft_split_safe.c diff --git a/inc/minishell.h b/inc/minishell.h index c300333..de9dffb 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -6,7 +6,7 @@ /* By: marvin +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:13 by whaffman #+# #+# */ -/* Updated: 2025/03/01 12:51:53 by whaffman ######## odam.nl */ +/* Updated: 2025/03/01 14:13:46 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -36,13 +36,13 @@ # ifndef DBG # define DBG -# endif +# endif // DBG # ifdef NOPROMPT # define PROMPT "$" # else # define PROMPT 0 -# endif +# endif // NOPROMPT # ifdef NOBANNER # define NOBANNER 1 diff --git a/inc/utils.h b/inc/utils.h index 1a32191..9b1c504 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:06:35 by whaffman #+# #+# */ -/* Updated: 2025/02/28 14:10:11 by whaffman ######## odam.nl */ +/* Updated: 2025/03/02 22:05:22 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -27,8 +27,10 @@ char *ft_substr_safe(t_minishell *msh, const char *str, unsigned int start, size_t len); char *ft_strjoin_safe(t_minishell *msh, const char *s1, const char *s2); +char **ft_split_safe(t_minishell *msh, const char *s, char c); void *malloc_safe(t_minishell *msh, size_t size); void free_safe(t_minishell *msh, void **ptr); +void ft_free_arr_safe(t_minishell *msh, char **arr); void free_freelist(t_minishell *msh); void ft_lstclear_safe(t_minishell *msh, t_list **lst, void (*del)(t_minishell *msh, void *)); diff --git a/sources.mk b/sources.mk index 3dcad37..f8c6b75 100644 --- a/sources.mk +++ b/sources.mk @@ -11,15 +11,16 @@ redirect_process_heredoc.c print_freelist.c print_commands.c main.c \ token_new.c token_char_convert.c token_parse.c token_type_convert.c \ signal_init.c.c signal.c history_write.c prompt.c history_load.c \ free_command_list.c free_minishell.c ft_lstnew_safe.c free_safe.c \ -free_lexer.c print_banner.c check_malloc.c free_freelist.c \ -ft_lstclear_safe.c error_msg.c free_token_list.c malloc_safe.c \ -free_minishell_line.c ft_strdup_safe.c free_token.c ft_substr_safe.c \ -init_minishell.c ft_strjoin_safe.c expander_allocate_memory.c \ -expander_parse_string.c expander_parse_variables.c \ -expander_expand_dollar.c expander_is_character.c \ -expander_get_variable.c executor_open_fds.c executor_count_fds.c \ -executor_fork.c executor_absolute_path.c executor_execute_pipeline.c \ -executor_child.c executor_close_fds.c executor_create_redirects.c \ -executor_create_pipes.c builtin_export.c simple_builtins.c \ -builtin_router.c is_builtin.c builtin_unset.c builtin_env.c \ -builtin_cd.c builtin_pwd.c builtin_exit.c builtin_echo.c \ +free_lexer.c ft_free_arr_safe.c print_banner.c check_malloc.c \ +free_freelist.c ft_lstclear_safe.c ft_split_safe.c error_msg.c \ +free_token_list.c malloc_safe.c free_minishell_line.c \ +ft_strdup_safe.c free_token.c ft_substr_safe.c init_minishell.c \ +ft_strjoin_safe.c expander_allocate_memory.c expander_parse_string.c \ +expander_parse_variables.c expander_expand_dollar.c \ +expander_is_character.c expander_get_variable.c executor_open_fds.c \ +executor_count_fds.c executor_fork.c executor_absolute_path.c \ +executor_execute_pipeline.c executor_child.c executor_close_fds.c \ +executor_create_redirects.c executor_create_pipes.c builtin_export.c \ +simple_builtins.c builtin_router.c is_builtin.c builtin_unset.c \ +builtin_env.c builtin_cd.c builtin_pwd.c builtin_exit.c \ +builtin_echo.c \ diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c index 74714c7..82cbbd8 100644 --- a/src/builtin/builtin_export.c +++ b/src/builtin/builtin_export.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */ -/* Updated: 2025/02/26 15:49:16 by whaffman ######## odam.nl */ +/* Updated: 2025/03/02 21:35:02 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -24,7 +24,8 @@ int builtin_export(t_minishell *msh, t_command *cmd) arr = ft_split(cmd->args[i], '='); if (arr[1] == NULL) { - ft_free_arr(arr); + ft_free_arr_safe(msh, arr); + DBG; i++; continue ; } @@ -36,7 +37,8 @@ int builtin_export(t_minishell *msh, t_command *cmd) } else environment_add(msh, arr[0], arr[1]); - ft_free_arr(arr); + ft_free_arr_safe(msh, arr); + DBG } return (SUCCESS); } diff --git a/src/environment/environment_free_list.c b/src/environment/environment_free_list.c index bb35108..acf45a1 100644 --- a/src/environment/environment_free_list.c +++ b/src/environment/environment_free_list.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:59 by whaffman #+# #+# */ -/* Updated: 2025/02/26 16:09:15 by whaffman ######## odam.nl */ +/* Updated: 2025/03/02 22:07:17 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -27,7 +27,7 @@ void environment_free_list(t_minishell *msh) else next = NULL; environment_free(msh, (*lst)->content); - free(*lst); + free_safe(msh, (void **)lst); *lst = next; } } diff --git a/src/environment/environment_parse.c b/src/environment/environment_parse.c index ba2e5e7..20074a2 100644 --- a/src/environment/environment_parse.c +++ b/src/environment/environment_parse.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 15:52:33 by whaffman #+# #+# */ -/* Updated: 2025/02/26 16:09:26 by whaffman ######## odam.nl */ +/* Updated: 2025/03/02 22:05:43 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,11 +20,11 @@ int environment_parse(t_minishell *msh, char **envp) return (FAILURE); while (*envp != NULL) { - env = ft_split(*envp, '='); + env = ft_split_safe(msh, *envp, '='); if (!env) return (FAILURE); environment_add(msh, env[0], env[1]); - ft_free_arr(env); + ft_free_arr_safe(msh, env); envp++; } return (SUCCESS); diff --git a/src/environment/environment_print.c b/src/environment/environment_print.c index d76c7d5..8b60aab 100644 --- a/src/environment/environment_print.c +++ b/src/environment/environment_print.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 13:52:08 by willem #+# #+# */ -/* Updated: 2025/02/26 16:09:35 by whaffman ######## odam.nl */ +/* Updated: 2025/03/01 14:24:19 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -24,5 +24,5 @@ void environment_print(t_minishell *msh) printf("%s\n", arr[i]); i++; } - ft_free_arr(arr); + ft_free_arr_safe(msh, arr); } diff --git a/src/executor/executor_absolute_path.c b/src/executor/executor_absolute_path.c index a876e87..1f3bc1c 100644 --- a/src/executor/executor_absolute_path.c +++ b/src/executor/executor_absolute_path.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:00:24 by willem #+# #+# */ -/* Updated: 2025/02/26 16:09:42 by whaffman ######## odam.nl */ +/* Updated: 2025/03/01 14:24:46 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -61,5 +61,5 @@ char *executor_absolute_path(t_minishell *msh, char *cmd) return (executable); i++; } - return (ft_free_arr(path), NULL); + return (ft_free_arr_safe(msh, path), NULL); } diff --git a/src/utils/ft_free_arr_safe.c b/src/utils/ft_free_arr_safe.c new file mode 100644 index 0000000..6cf1aa9 --- /dev/null +++ b/src/utils/ft_free_arr_safe.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* ft_free_arr_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/03/01 14:20:45 by whaffman #+# #+# */ +/* Updated: 2025/03/01 14:26:58 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void ft_free_arr_safe(t_minishell *msh, char **arr) +{ + int i; + + i = 0; + while (arr[i] != NULL) + { + free_safe(msh, (void **)&arr[i]); + i++; + } + free_safe(msh, (void **)&arr); +} diff --git a/src/utils/ft_split_safe.c b/src/utils/ft_split_safe.c new file mode 100644 index 0000000..cc25520 --- /dev/null +++ b/src/utils/ft_split_safe.c @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* ft_split_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/03/02 21:58:06 by whaffman #+# #+# */ +/* Updated: 2025/03/02 22:04:08 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static void *free_arr_safe(t_minishell *msh, int n, char ***arr) +{ + while (n-- > 0) + { + free_safe(msh, (void**) &(*arr)[n]); + DBG; + } + free_safe(msh,(void**) arr); + return (NULL); +} + +char **ft_split_safe(t_minishell *msh, char const *s, char c) +{ + char **result; + int n; + int i; + int j; + + result = malloc_safe(msh, (ft_count_words(s, c) + 1) * sizeof(char *)); + if (!result) + return (NULL); + i = 0; + n = 0; + while (s[i]) + { + j = 0; + while (s[i] == c) + i++; + while (s[i + j] && s[i + j] != c) + j++; + if (j) + result[n] = ft_substr_safe(msh, s, i, j); + if (j && !result[n++]) + return (free_arr_safe(msh, n, &result)); + i += j; + } + result[n] = NULL; + return (result); +}