diff options
| author | Shell <[email protected]> | 2024-08-21 18:10:25 +0800 |
|---|---|---|
| committer | Meco Man <[email protected]> | 2024-08-24 15:46:35 -0400 |
| commit | 564ca848f428f7be6aa2372ff8666c1d7883e1b5 (patch) | |
| tree | 73aa52a2d476f849730e571d3009f66efb29c1c2 | |
| parent | d6d675262752a704b7ea725781a4687ad70feff5 (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.c | 23 |
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) |
