From ec9177a513d1fdd510abcb70a9640d1bd94023f5 Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 15 Jun 2020 11:01:03 +0200 Subject: Fixing leaks (need refactoring) --- src/builtin/echo.c | 7 +++- src/eval/cmd.c | 100 +++++++++++++++++++++++++++++++---------------------- src/main.c | 45 ++++++++++++------------ src/preprocess.c | 17 ++++++--- 4 files changed, 100 insertions(+), 69 deletions(-) (limited to 'src') diff --git a/src/builtin/echo.c b/src/builtin/echo.c index 886c2ca..0c4ff8b 100644 --- a/src/builtin/echo.c +++ b/src/builtin/echo.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:10:47 by charles #+# #+# */ -/* Updated: 2020/04/02 11:18:16 by charles ### ########.fr */ +/* Updated: 2020/06/15 10:12:53 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,11 @@ int builtin_echo(char **argv, t_env env) bool newline; (void)env; + if (argv[1] == NULL) + { + ft_putchar('\n'); + return (0); + } newline = !ft_strcmp(argv[1], "-n") == 0; if (!newline) argv++; diff --git a/src/eval/cmd.c b/src/eval/cmd.c index 027c75b..958c7ae 100644 --- a/src/eval/cmd.c +++ b/src/eval/cmd.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/14 10:41:31 by charles #+# #+# */ -/* Updated: 2020/06/14 21:23:20 by charles ### ########.fr */ +/* Updated: 2020/06/15 10:58:59 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,10 +23,10 @@ */ int fork_wrap( - int fd_in, - int fd_out, - void *passed, - int (*wrapped)(void *param)) + int fd_in, + int fd_out, + void *passed, + int (*wrapped)(void *param)) { int status; pid_t child_pid; @@ -46,12 +46,6 @@ int fork_wrap( return (WEXITSTATUS(child_pid)); } -/* -** \brief execve syscall wrapper passed it to fork_wrap -** \param param function params -** \return execve return value -*/ - int forked_cmd(void *void_param) { t_fork_param_cmd *param; @@ -64,26 +58,6 @@ int forked_cmd(void *void_param) return (execve(param->exec_path, param->argv, (char**)param->env->data)); } -int open_redirection(t_ftlst *filename_tokens, t_env env, int oflag) -{ - // check in and out (single string) - // argv[0]: [string]: ambiguous redirect code 1 - - // check in and out (exist) - // argv[0]: [string]: No such file or directory (probably from errno) - - char *filename; - int fd; - - if (filename_tokens == NULL) - return (MS_NO_FD); - if ((filename = preprocess_filename(filename_tokens, env)) == NULL) - return (-1); - if ((fd = open(filename, oflag)) == -1) - return (-1); //file error; - return (fd); -} - bool redir_has_tag(t_ftlst *redir, enum e_token_tag tags) { return (((t_token*)redir->data)->tag & tags); @@ -111,27 +85,59 @@ bool redir_extract(t_ftlst *redirs, t_env env, int *fd_in, int *fd_out) } curr = curr->next; } - filename = preprocess_filename(redirs->next, env); + if ((filename = preprocess_filename(&redirs->next, env)) == NULL) + { + ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); + ft_lstdestroy(&after, (void (*)(void*))token_destroy); + return (false); + } if (redir_has_tag(redirs, TAG_REDIR_IN)) { if (*fd_in != STDIN_FILENO) close(*fd_in); if ((*fd_in = open(filename, O_RDONLY)) == -1) + { + error_eval_put(ERROR_OPEN, filename); + ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); + ft_lstdestroy(&after, (void (*)(void*))token_destroy); + free(filename); return (false); + } } - else if (redir_has_tag(redirs, TAG_REDIR_OUT | TAG_REDIR_APPEND)) + else if (redir_has_tag(redirs, TAG_REDIR_OUT)) { if (*fd_out != STDOUT_FILENO) close(*fd_out); if ((*fd_out = open(filename, - (redir_has_tag(redirs, TAG_REDIR_APPEND) ? O_APPEND : O_WRONLY) - | O_CREAT | O_TRUNC, 0644)) == -1) + O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1) + { + error_eval_put(ERROR_OPEN, filename); + ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); + ft_lstdestroy(&after, (void (*)(void*))token_destroy); + free(filename); return (false); + } + } + else if (redir_has_tag(redirs, TAG_REDIR_APPEND)) + { + if (*fd_out != STDOUT_FILENO) + close(*fd_out); + if ((*fd_out = open(filename, + O_WRONLY | O_APPEND | O_CREAT, 0644)) == -1) + { + error_eval_put(ERROR_OPEN, filename); + ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); + ft_lstdestroy(&after, (void (*)(void*))token_destroy); + free(filename); + return (false); + } } + ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); + free(filename); return (redir_extract(after, env, fd_in, fd_out)); } -int eval_cmd(t_env env, t_path path, t_ast *ast) +int eval_cmd(t_env env, t_path path, t_ast *ast) { t_fork_param_cmd param; int fd_in; @@ -141,21 +147,33 @@ int eval_cmd(t_env env, t_path path, t_ast *ast) fd_in = STDIN_FILENO; fd_out = STDOUT_FILENO; if (!redir_extract(ast->redirs, env, &fd_in, &fd_out)) + { + ast->redirs = NULL; return (-1); + } + ast->redirs = NULL; - argv = preprocess(ast->cmd_argv, env); + if ((argv = preprocess(&ast->cmd_argv, env)) == NULL) + { + ast->cmd_argv = NULL; + return (-1); + } param.builtin = builtin_search_func(argv[0]); if (param.builtin == NULL) { param.exec_path = exec_search_path(path, env_search(env, "PATH"), argv[0]); - /* // get cmd path */ - /* // argv[0]: [string]: command not found code 127 */ if (param.exec_path == NULL) - return (-1); //not_found; + { + error_eval_put(ERROR_CMD_NOT_FOUND, argv[0]); + ft_split_destroy(argv); + return (-1); // return error status + } } param.argv = argv; param.env = env; - return (fork_wrap(fd_in, fd_out, ¶m, &forked_cmd)); + int ret = fork_wrap(fd_in, fd_out, ¶m, &forked_cmd); + ft_split_destroy(argv); + return (ret); } diff --git a/src/main.c b/src/main.c index e81c634..ec99f51 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/06/14 21:21:01 by charles ### ########.fr */ +/* Updated: 2020/06/15 11:00:03 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -81,34 +81,34 @@ int main(int argc, char **argv, char **envp) /* free(j); */ t_ftlst *args = NULL; - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "echo"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "bonjour"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "je"))); + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "echo"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "bonjour"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "je"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "cat"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-e"))); */ + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "cat"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-e"))); /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "ls"))); */ /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-a"))); */ /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-l"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "|)}>#*.c"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "src#<{(|.c include#<{(|.h"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "$A$B"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "\\\\"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ - /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); */ + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "*/*.c"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src/*.c include/*.h"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); + ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); t_ftlst *redirs = NULL; - /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_IN, NULL))); */ - /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); */ + ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_IN, NULL))); + ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo"))); @@ -117,6 +117,7 @@ int main(int argc, char **argv, char **envp) ast->redirs = redirs; printf("eval %d\n", eval_cmd(env, path, ast)); + ast_destroy(ast); /* char **as = preprocess(l, env); */ diff --git a/src/preprocess.c b/src/preprocess.c index 278e8ef..1c59e28 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,13 +6,14 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/06/14 21:25:05 by charles ### ########.fr */ +/* Updated: 2020/06/15 10:47:24 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" #include "ms_glob.h" #include "lexer.h" +#include "eval.h" static bool st_escapable(char c, enum e_token_tag tag) { @@ -114,14 +115,18 @@ static void st_iter_func_unwrap_token(void **addr) } // need to free argv on error -char **preprocess(t_ftlst *tokens, t_env env) +char **preprocess(t_ftlst **tokens, t_env env) { size_t i; t_token *token; t_ftvec *argv; - if ((argv = ft_vecfrom_lst(tokens)) == NULL) + if ((argv = ft_vecfrom_lst(*tokens)) == NULL) + { + ft_lstdestroy(tokens, NULL); return (NULL); + } + ft_lstdestroy(tokens, NULL); i = -1; while (++i < argv->size) { @@ -160,7 +165,7 @@ char **preprocess(t_ftlst *tokens, t_env env) } // need to free tokens -char *preprocess_filename(t_ftlst *tokens, t_env env) +char *preprocess_filename(t_ftlst **tokens, t_env env) { char **strs; char *ret; @@ -170,7 +175,9 @@ char *preprocess_filename(t_ftlst *tokens, t_env env) return (NULL); if (strs[1] != NULL) { - // ambiguous + // save tokens + error_eval_put(ERROR_AMBIGUOUS_REDIR, strs[1]); + ft_split_destroy(strs); return (NULL); } ret = strs[0]; -- cgit