summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShell <[email protected]>2024-08-21 18:10:25 +0800
committerMeco Man <[email protected]>2024-08-24 15:46:35 -0400
commit564ca848f428f7be6aa2372ff8666c1d7883e1b5 (patch)
tree73aa52a2d476f849730e571d3009f66efb29c1c2
parentd6d675262752a704b7ea725781a4687ad70feff5 (diff)
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 <[email protected]>
-rw-r--r--components/lwp/lwp_args.c23
1 files 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)