diff options
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/shell/hush.c b/shell/hush.c index 48f503c..c2b987f 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -6199,7 +6199,7 @@ static char *expand_string_to_string(const char *str, int do_unbackslash) return (char*)list; } -/* Used for "eval" builtin and case string */ +#if ENABLE_HUSH_CASE static char* expand_strvec_to_string(char **argv) { char **list; @@ -6221,6 +6221,7 @@ static char* expand_strvec_to_string(char **argv) debug_printf_expand("strvec_to_string='%s'\n", (char*)list); return (char*)list; } +#endif static char **expand_assignments(char **argv, int count) { @@ -9349,13 +9350,34 @@ static int FAST_FUNC builtin_eval(char **argv) int rcode = EXIT_SUCCESS; argv = skip_dash_dash(argv); - if (*argv) { - char *str = expand_strvec_to_string(argv); + if (argv[0]) { + char *str = NULL; + + if (argv[1]) { + /* "The eval utility shall construct a command by + * concatenating arguments together, separating + * each with a <space> character." + */ + char *p; + unsigned len = 0; + char **pp = argv; + do + len += strlen(*pp) + 1; + while (*++pp); + str = p = xmalloc(len); + pp = argv; + do { + p = stpcpy(p, *pp); + *p++ = ' '; + } while (*++pp); + p[-1] = '\0'; + } + /* bash: * eval "echo Hi; done" ("done" is syntax error): * "echo Hi" will not execute too. */ - parse_and_run_string(str); + parse_and_run_string(str ? str : argv[0]); free(str); rcode = G.last_exitcode; } |