diff options
-rw-r--r-- | shell/hush.c | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/shell/hush.c b/shell/hush.c index 1f83267be..9d3f06db0 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -9806,41 +9806,41 @@ static int FAST_FUNC builtin_pwd(char **argv UNUSED_PARAM) static int FAST_FUNC builtin_eval(char **argv) { - int rcode = EXIT_SUCCESS; - argv = skip_dash_dash(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'; - } + if (!argv[0]) + return EXIT_SUCCESS; + if (!argv[1]) { /* bash: * eval "echo Hi; done" ("done" is syntax error): * "echo Hi" will not execute too. */ - parse_and_run_string(str ? str : argv[0]); + parse_and_run_string(argv[0]); + } else { + /* "The eval utility shall construct a command by + * concatenating arguments together, separating + * each with a <space> character." + */ + char *str, *p; + unsigned len = 0; + char **pp = argv; + do + len += strlen(*pp) + 1; + while (*++pp); + str = p = xmalloc(len); + pp = argv; + for (;;) { + p = stpcpy(p, *pp); + pp++; + if (!*pp) + break; + *p++ = ' '; + } + parse_and_run_string(str); free(str); - rcode = G.last_exitcode; } - return rcode; + return G.last_exitcode; } static int FAST_FUNC builtin_exec(char **argv) |