hush: fix handling of ^C in eval

function                                             old     new   delta
run_list                                            1044    1259    +215
builtin_eval                                          45     126     +81
expand_strvec_to_string                               91       -     -91
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 2/0 up/down: 296/-91)           Total: 205 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-01-11 13:17:30 +01:00
parent 932b9971d0
commit 1f1911239c
5 changed files with 36 additions and 4 deletions

View File

@ -0,0 +1,2 @@

Done:0

View File

@ -0,0 +1,3 @@
c=`printf '\3'`
eval "echo $c"
echo Done:$?

View File

@ -6199,7 +6199,7 @@ static char *expand_string_to_string(const char *str, int do_unbackslash)
return (char*)list; return (char*)list;
} }
/* Used for "eval" builtin and case string */ #if ENABLE_HUSH_CASE
static char* expand_strvec_to_string(char **argv) static char* expand_strvec_to_string(char **argv)
{ {
char **list; char **list;
@ -6221,6 +6221,7 @@ static char* expand_strvec_to_string(char **argv)
debug_printf_expand("strvec_to_string='%s'\n", (char*)list); debug_printf_expand("strvec_to_string='%s'\n", (char*)list);
return (char*)list; return (char*)list;
} }
#endif
static char **expand_assignments(char **argv, int count) static char **expand_assignments(char **argv, int count)
{ {
@ -9349,13 +9350,34 @@ static int FAST_FUNC builtin_eval(char **argv)
int rcode = EXIT_SUCCESS; int rcode = EXIT_SUCCESS;
argv = skip_dash_dash(argv); argv = skip_dash_dash(argv);
if (*argv) { if (argv[0]) {
char *str = expand_strvec_to_string(argv); 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: /* bash:
* eval "echo Hi; done" ("done" is syntax error): * eval "echo Hi; done" ("done" is syntax error):
* "echo Hi" will not execute too. * "echo Hi" will not execute too.
*/ */
parse_and_run_string(str); parse_and_run_string(str ? str : argv[0]);
free(str); free(str);
rcode = G.last_exitcode; rcode = G.last_exitcode;
} }

View File

@ -0,0 +1,2 @@

Done:0

View File

@ -0,0 +1,3 @@
c=`printf '\3'`
eval "echo $c"
echo Done:$?