From 564ca848f428f7be6aa2372ff8666c1d7883e1b5 Mon Sep 17 00:00:00 2001 From: Shell Date: Wed, 21 Aug 2024 18:10:25 +0800 Subject: [PATCH] fixup: uninitialized argument vector element This patch addresses the potential issue of uninitialized elements in the argument vector returned by `lwp_get_command_line_args()`. The previous implementation could leave `argv` in an inconsistent state if certain errors occurred, leading to possible undefined behavior. Changes: - Replaced `rt_malloc()` with `rt_calloc()` to ensure `argv` is properly initialized. - Added a consistent error handling path using `goto error_exit` to handle memory allocation failures and string copy errors. - Ensured `lwp_free_command_line_args()` is called before returning on error, preventing potential memory leaks. Signed-off-by: Shell --- components/lwp/lwp_args.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/components/lwp/lwp_args.c b/components/lwp/lwp_args.c index 3c70f7ce91..c122a0f6c5 100644 --- a/components/lwp/lwp_args.c +++ b/components/lwp/lwp_args.c @@ -633,10 +633,10 @@ quit: return error; } -char** lwp_get_command_line_args(struct rt_lwp *lwp) +char **lwp_get_command_line_args(struct rt_lwp *lwp) { size_t argc = 0; - char** argv = NULL; + char **argv = NULL; int ret; size_t i; size_t len; @@ -648,7 +648,7 @@ char** lwp_get_command_line_args(struct rt_lwp *lwp) { return RT_NULL; } - argv = (char**)rt_malloc((argc + 1) * sizeof(char*)); + argv = (char**)rt_calloc((argc + 1), sizeof(char*)); if (argv) { @@ -658,25 +658,23 @@ char** lwp_get_command_line_args(struct rt_lwp *lwp) ret = lwp_data_get(lwp, &argvp, &((char **)lwp->args)[1 + i], sizeof(argvp)); if (ret == 0) { - lwp_free_command_line_args(argv); - return RT_NULL; + goto error_exit; } - len = lwp_user_strlen_ext(lwp, argvp); - if (len > 0) + len = lwp_user_strlen_ext(lwp, argvp); + if (len >= 0) { argv[i] = (char*)rt_malloc(len + 1); ret = lwp_data_get(lwp, argv[i], argvp, len); - if (ret == 0) + if (ret != len) { - lwp_free_command_line_args(argv); - return RT_NULL; + goto error_exit; } argv[i][len] = '\0'; } else { - argv[i] = NULL; + goto error_exit; } } argv[argc] = NULL; @@ -684,6 +682,9 @@ char** lwp_get_command_line_args(struct rt_lwp *lwp) } return argv; +error_exit: + lwp_free_command_line_args(argv); + return RT_NULL; } void lwp_print_envp(struct rt_lwp *lwp)