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:
parent
932b9971d0
commit
1f1911239c
2
shell/ash_test/ash-misc/control_char2.right
Normal file
2
shell/ash_test/ash-misc/control_char2.right
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
Done:0
|
3
shell/ash_test/ash-misc/control_char2.tests
Executable file
3
shell/ash_test/ash-misc/control_char2.tests
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
c=`printf '\3'`
|
||||||
|
eval "echo $c"
|
||||||
|
echo Done:$?
|
30
shell/hush.c
30
shell/hush.c
@ -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;
|
||||||
}
|
}
|
||||||
|
2
shell/hush_test/hush-misc/control_char2.right
Normal file
2
shell/hush_test/hush-misc/control_char2.right
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
Done:0
|
3
shell/hush_test/hush-misc/control_char2.tests
Executable file
3
shell/hush_test/hush-misc/control_char2.tests
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
c=`printf '\3'`
|
||||||
|
eval "echo $c"
|
||||||
|
echo Done:$?
|
Loading…
Reference in New Issue
Block a user