Message ID | 20240705085935.1255725-3-hadess@hadess.net |
---|---|
State | New |
Headers | show |
Series | Fix a number of static analysis issues #5 | expand |
On Fri, 2024-07-05 at 10:57 +0200, Bastien Nocera wrote: <snip> > diff --git a/src/shared/shell.c b/src/shared/shell.c > index add4fa131c7a..e8f75124f167 100644 > --- a/src/shared/shell.c > +++ b/src/shared/shell.c > @@ -452,13 +452,23 @@ static void shell_print_menu_zsh_complete(void) > } > } > > +static int _wordexp(const char *restrict s, wordexp_t *restrict p, > int flags) > +{ > + int ret; > + > + ret = wordexp(s, p, flags); > + if (ret != 0) > + wordfree(p); > + return ret; > +} > + > static int parse_args(char *arg, wordexp_t *w, char *del, int flags) > { > char *str; > > str = strdelimit(arg, del, '"'); > > - if (wordexp(str, w, flags)) { > + if (_wordexp(str, w, flags) != 0) { > free(str); > return -EINVAL; > } Any reason not to pick this patch up? You can see here: https://sourceware.org/git/?p=glibc.git;a=blob;f=posix/wordexp.c;h=a7362ef31b05280001e961c3a630e953110b7397;hb=HEAD#l2203 that wordexp() will return without freeing we_wordv if there's an error and the WRDE_APPEND flag isn't set. Let me know if you want me to re-spin this one with a different style, or want me to add the info above to the commit message. Cheers > @@ -537,7 +547,7 @@ static int cmd_exec(const struct > bt_shell_menu_entry *entry, > goto fail; > } > > - flags |= WRDE_APPEND; > + flags |= WRDE_APPEND | WRDE_REUSE; > opt = strdup(entry->arg + len + 1); > > optional: > @@ -1043,7 +1053,7 @@ static char **args_completion(const struct > bt_shell_menu_entry *entry, int argc, > args.we_offs = 0; > wordfree(&args); > > - if (wordexp(str, &args, WRDE_NOCMD)) > + if (_wordexp(str, &args, WRDE_NOCMD)) > goto done; > > rl_completion_display_matches_hook = NULL; > @@ -1115,7 +1125,7 @@ static char **shell_completion(const char > *text, int start, int end) > if (start > 0) { > wordexp_t w; > > - if (wordexp(rl_line_buffer, &w, WRDE_NOCMD)) > + if (_wordexp(rl_line_buffer, &w, WRDE_NOCMD)) > return NULL; > > matches = menu_completion(default_menu, text, > w.we_wordc, > @@ -1416,7 +1426,7 @@ int bt_shell_exec(const char *input) > if (data.monitor) > bt_log_printf(0xffff, data.name, LOG_INFO, "%s", > input); > > - err = wordexp(input, &w, WRDE_NOCMD); > + err = _wordexp(input, &w, WRDE_NOCMD); > switch (err) { > case WRDE_BADCHAR: > return -EBADMSG; > @@ -1426,7 +1436,7 @@ int bt_shell_exec(const char *input) > case WRDE_NOSPACE: > return -ENOMEM; > case WRDE_CMDSUB: > - if (wordexp(input, &w, 0)) > + if (_wordexp(input, &w, 0)) > return -ENOEXEC; > break; > };
diff --git a/src/shared/shell.c b/src/shared/shell.c index add4fa131c7a..e8f75124f167 100644 --- a/src/shared/shell.c +++ b/src/shared/shell.c @@ -452,13 +452,23 @@ static void shell_print_menu_zsh_complete(void) } } +static int _wordexp(const char *restrict s, wordexp_t *restrict p, int flags) +{ + int ret; + + ret = wordexp(s, p, flags); + if (ret != 0) + wordfree(p); + return ret; +} + static int parse_args(char *arg, wordexp_t *w, char *del, int flags) { char *str; str = strdelimit(arg, del, '"'); - if (wordexp(str, w, flags)) { + if (_wordexp(str, w, flags) != 0) { free(str); return -EINVAL; } @@ -537,7 +547,7 @@ static int cmd_exec(const struct bt_shell_menu_entry *entry, goto fail; } - flags |= WRDE_APPEND; + flags |= WRDE_APPEND | WRDE_REUSE; opt = strdup(entry->arg + len + 1); optional: @@ -1043,7 +1053,7 @@ static char **args_completion(const struct bt_shell_menu_entry *entry, int argc, args.we_offs = 0; wordfree(&args); - if (wordexp(str, &args, WRDE_NOCMD)) + if (_wordexp(str, &args, WRDE_NOCMD)) goto done; rl_completion_display_matches_hook = NULL; @@ -1115,7 +1125,7 @@ static char **shell_completion(const char *text, int start, int end) if (start > 0) { wordexp_t w; - if (wordexp(rl_line_buffer, &w, WRDE_NOCMD)) + if (_wordexp(rl_line_buffer, &w, WRDE_NOCMD)) return NULL; matches = menu_completion(default_menu, text, w.we_wordc, @@ -1416,7 +1426,7 @@ int bt_shell_exec(const char *input) if (data.monitor) bt_log_printf(0xffff, data.name, LOG_INFO, "%s", input); - err = wordexp(input, &w, WRDE_NOCMD); + err = _wordexp(input, &w, WRDE_NOCMD); switch (err) { case WRDE_BADCHAR: return -EBADMSG; @@ -1426,7 +1436,7 @@ int bt_shell_exec(const char *input) case WRDE_NOSPACE: return -ENOMEM; case WRDE_CMDSUB: - if (wordexp(input, &w, 0)) + if (_wordexp(input, &w, 0)) return -ENOEXEC; break; };