From 5b3e566b25563a0c3ade668dc07e9578e4fba527 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Mon, 29 Nov 2021 12:15:17 +0100 Subject: [PATCH] searching solution for invalid free in readline. --- srcs/builtins/export.c | 2 +- srcs/free.c | 27 ++++++- srcs/init.c | 19 ++--- tests/test_environ.c | 163 ----------------------------------------- 4 files changed, 33 insertions(+), 178 deletions(-) delete mode 100644 tests/test_environ.c diff --git a/srcs/builtins/export.c b/srcs/builtins/export.c index 9657057..6e190b7 100644 --- a/srcs/builtins/export.c +++ b/srcs/builtins/export.c @@ -25,7 +25,7 @@ int builtin_export(int argc, char *argv[], t_all *c) if (environ[env_position] == '\0') environ = ft_resize_2d_arr(environ, 1); environ[env_position] = ft_strdup(argv[1]); - if (!ft_strncmp(var[0], "PATH", 4 + 1)) + if (!ft_strncmp(var[0], "PATH", 4 + 1)) // TODO : NON. Ce n'est pas la fin de la string donc "strlen() + 1" n'est pas adapté c->path = retrieve_path(); // free var return (0); diff --git a/srcs/free.c b/srcs/free.c index fdda745..5d379be 100644 --- a/srcs/free.c +++ b/srcs/free.c @@ -6,18 +6,41 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/10 23:53:17 by lperrey #+# #+# */ -/* Updated: 2021/11/26 21:51:44 by lperrey ### ########.fr */ +/* Updated: 2021/11/27 23:50:15 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +// WIP : un peu zob. Previent les invalid free de readline, mais peut leak si "LINES" ou "COLUMNS" sont redefini avec export +void ft_free_2d_arr_ENVIRON(void *ptr) +{ + unsigned int i; + char **arr; + + if (!ptr) + return ; + arr = (char **)ptr; + i = 0; + while (arr[i]) + { + if (ft_strncmp(arr[i], "LINES=", 5 + 1) != 0 && ft_strncmp(arr[i], "COLUMNS=", 7 + 1) != 0) + free(arr[i]); + i++; + } + free(arr); +} + int free_exit(t_all *c, int exit_status) { free(c->prompt_base); free(c->prompt); ft_lstclear((t_list **)&c->token_list, free); - ft_free_2d_arr(environ); + //ft_free_2d_arr(environ); + ft_free_2d_arr_ENVIRON(environ); + free(g_ori_environ); + //environ = g_ori_environ; // WIP free test + environ = NULL; // WIP free test ft_free_2d_arr(c->path); free_pipeline(&c->cmd_arr); //if (c->termios_changed) diff --git a/srcs/init.c b/srcs/init.c index 027a127..0c20481 100644 --- a/srcs/init.c +++ b/srcs/init.c @@ -6,26 +6,25 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */ -/* Updated: 2021/11/26 21:51:40 by lperrey ### ########.fr */ +/* Updated: 2021/11/27 23:50:06 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" static char *init_prompt_base(void); -// pas static si utilisee par cd -//static char *init_prompt(char *prompt_base); -char *init_prompt(char *prompt_base); -//int init(t_all *c, char *envp[]) int init(t_all *c) { ft_bzero(c, sizeof (*c)); environ = ft_dup_2d_arr(environ, (t_dup_f)ft_strdup); + g_ori_environ = environ; // Wip free test + //environ = ft_resize_2d_arr(environ, 0); // WIP free test if (!environ) - return (ft_reti_perror(0, "ft_dup_2d_char_arr(environ) error")); + return (ft_reti_perror(0, "ft_dup_2d_arr(environ) error")); + //environ = NULL; // WIP free test //print_matrix(c->envp, "\n --- \n"); // TEST WIP - c->path = retrieve_path(environ); // No return check. Its intended. PATH is optional + c->path = retrieve_path(); // No return check. Its intended. PATH is optional c->prompt_base = init_prompt_base(); if (!c->prompt_base) return (ft_reti_perror(0, "init_prompt_base() error")); @@ -37,14 +36,11 @@ int init(t_all *c) } // done : TODO : Un appel à builtin_export() modifiant $PATH doit aussi entrainer un appel à "c->path = retrieve_path()" -// changer le prototype si utilise pas envp -char **retrieve_path(char *envp[]) +char **retrieve_path(void) { char *path; char **path_split; - (void)envp; - //path = search_env_var(envp, "PATH"); // A reprendre du projet pipex si besoin de remplacer getenv() path = getenv("PATH"); if (!path) return (ft_retp_print(NULL, "minishell: Warning, $PATH not set\n", 2)); @@ -74,7 +70,6 @@ static char *init_prompt_base(void) // WIP, error return TODO return (prompt_base); } -//static char *init_prompt(char *prompt_base) // WIP, error return TODO char *init_prompt(char *prompt_base) // WIP, error return TODO { char *prompt; diff --git a/tests/test_environ.c b/tests/test_environ.c deleted file mode 100644 index 11bb493..0000000 --- a/tests/test_environ.c +++ /dev/null @@ -1,163 +0,0 @@ -#include -#include -#include -#include - -# define COL_GREEN "\001\e[0;32m\002" -# define COL_BROWN "\001\e[0;33m\002" -# define COL_PURPL "\001\e[0;35m\002" -# define _END "\001\e[0m\002" - -size_t ft_strlen(const char *s); -char *ft_strdup(const char *s); -size_t ft_2d_arrlen(void *ptr); -void *ft_dup_2d_arr(void *ptr, void *(*dup_func)(void *)); -void print_matrix(char **matrix, char *sep); -void *ft_resize_2d_arr(void *ptr, size_t add_nbr); -typedef void *(*t_dup_f)(void *); - - -int main(int argc, char *argv[], char *envp[]) -{ - extern char **environ; - int env_len; - char *print; - char *env_var; - - (void)argc; - (void)argv; - -print = COL_GREEN"\n[original ] :\n"_END; -write(1, print, strlen(print)); - env_len = ft_2d_arrlen(environ); - printf("\nenviron_len: %i\nenviron :\n", env_len); - print_matrix(environ, "\n"); - -print = COL_GREEN"\n[getenv] :\n"_END; -write(1, print, strlen(print)); - env_var = getenv("TESTT"); - if (env_var) - write(1, COL_PURPL"FOUND\n"_END, 21); - else - write(1, COL_PURPL"NOT FOUND\n"_END, 25); - -print = COL_BROWN"\n[resize ]...\n"_END; -write(1, print, strlen(print)); - environ = ft_resize_2d_arr(environ, 1); - -print = COL_BROWN"\n[add to ]...\n"_END; -write(1, print, strlen(print)); - environ[env_len] = "TESTT=testt"; - -print = COL_GREEN"\n[modified ] :\n"_END; -write(1, print, strlen(print)); - env_len = ft_2d_arrlen(environ); - printf("\nenviron_len: %i\nenviron :\n", env_len); - print_matrix(environ, "\n"); - -print = COL_GREEN"\n[getenv] :\n"_END; -write(1, print, strlen(print)); - env_var = getenv("TESTT"); - if (env_var) - write(1, COL_PURPL"FOUND\n"_END, 21); - else - write(1, COL_PURPL"NOT FOUND\n"_END, 25); - -printf("\n%s\n", env_var); - - return (0); -} - -void *ft_resize_2d_arr(void *ptr, size_t add_nbr) -{ - unsigned int i; - char **arr; - char **new_arr; - - new_arr = malloc((ft_2d_arrlen(ptr) + add_nbr + 1) * sizeof (void *)); - arr = (char **)ptr; - i = 0; - while (arr[i]) - { - new_arr[i] = arr[i]; - i++; - } -// free(arr); - return (new_arr); -} - -void print_matrix(char **matrix, char *sep) -{ - int i; - - i = 0; - while (matrix[i]) - { - printf("%s", matrix[i]); - if (matrix[i + 1]) - printf("%s", sep); - fflush(stdout); - i++; - } - write(1, "\n", 1); -} - -size_t ft_strlen(const char *s) -{ - size_t len; - - len = 0; - while (s[len] != '\0') - len++; - return (len); -} - -char *ft_strdup(const char *s) -{ - unsigned int i; - char *dup; - - dup = malloc(ft_strlen(s) + 1); - if (!dup) - return (NULL); - i = 0; - while (s[i]) - { - dup[i] = s[i]; - i++; - } - dup[i] = '\0'; - return (dup); -} - -size_t ft_2d_arrlen(void *ptr) // Replace ft_arrlen() -{ - size_t len; - char **arr; - - arr = (char **)ptr; - len = 0; - while (arr[len] != NULL) - len++; - return (len); -} - -void *ft_dup_2d_arr(void *ptr, void *(*dup_func)(void *)) -{ - unsigned int i; - char **arr; - char **new_arr; - - new_arr = malloc((ft_2d_arrlen(ptr) + 1) * sizeof (void *)); - if (!new_arr) - return (NULL); - arr = (char **)ptr; - i = 0; - while (arr[i]) - { - new_arr[i] = dup_func(arr[i]); - i++; - } - new_arr[i] = NULL; - return (new_arr); -}