From e59591a364e43bccb6fd4d373d3ed86fc77dffb7 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 6 Jul 2017 20:12:44 +0200 Subject: hush: Print error messages on shift -1 Signed-off-by: Denys Vlasenko --- shell/ash_test/ash-misc/shift1.tests | 2 +- shell/hush.c | 13 ++++++++++++- shell/hush_test/hush-misc/shift1.right | 10 ++++++++++ shell/hush_test/hush-misc/shift1.tests | 10 ++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 shell/hush_test/hush-misc/shift1.right create mode 100755 shell/hush_test/hush-misc/shift1.tests diff --git a/shell/ash_test/ash-misc/shift1.tests b/shell/ash_test/ash-misc/shift1.tests index 0992d9b1b..2774b35ea 100755 --- a/shell/ash_test/ash-misc/shift1.tests +++ b/shell/ash_test/ash-misc/shift1.tests @@ -1,5 +1,5 @@ $THIS_SH -c 'shift; echo "$@"' 0 1 2 3 4 -#We do abort on -1, but then we abort. bash executes echo. +# We do complain on -1, but then we abort. bash executes echo. $THIS_SH -c 'shift -1; echo "$@"' 0 1 2 3 4 $THIS_SH -c 'shift 0; echo "$@"' 0 1 2 3 4 $THIS_SH -c 'shift 1; echo "$@"' 0 1 2 3 4 diff --git a/shell/hush.c b/shell/hush.c index f6b50dec6..0ade2ccca 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -9377,7 +9377,18 @@ static int FAST_FUNC builtin_shift(char **argv) int n = 1; argv = skip_dash_dash(argv); if (argv[0]) { - n = atoi(argv[0]); + n = bb_strtou(argv[0], NULL, 10); + if (errno || n < 0) { + /* shared string with ash.c */ + bb_error_msg("Illegal number: %s", argv[0]); + /* + * ash aborts in this case. + * bash prints error message and set $? to 1. + * Interestingly, for "shift 99999" bash does not + * print error message, but does set $? to 1 + * (and does no shifting at all). + */ + } } if (n >= 0 && n < G.global_argc) { if (G_global_args_malloced) { diff --git a/shell/hush_test/hush-misc/shift1.right b/shell/hush_test/hush-misc/shift1.right new file mode 100644 index 000000000..e3ab61392 --- /dev/null +++ b/shell/hush_test/hush-misc/shift1.right @@ -0,0 +1,10 @@ +2 3 4 +hush: Illegal number: -1 +1 2 3 4 +1 2 3 4 +2 3 4 +3 4 +4 + +1 2 3 4 +1 2 3 4 diff --git a/shell/hush_test/hush-misc/shift1.tests b/shell/hush_test/hush-misc/shift1.tests new file mode 100755 index 000000000..f2a264751 --- /dev/null +++ b/shell/hush_test/hush-misc/shift1.tests @@ -0,0 +1,10 @@ +$THIS_SH -c 'shift; echo "$@"' 0 1 2 3 4 +#We complain on -1 and continue. +$THIS_SH -c 'shift -1; echo "$@"' 0 1 2 3 4 +$THIS_SH -c 'shift 0; echo "$@"' 0 1 2 3 4 +$THIS_SH -c 'shift 1; echo "$@"' 0 1 2 3 4 +$THIS_SH -c 'shift 2; echo "$@"' 0 1 2 3 4 +$THIS_SH -c 'shift 3; echo "$@"' 0 1 2 3 4 +$THIS_SH -c 'shift 4; echo "$@"' 0 1 2 3 4 +$THIS_SH -c 'shift 5; echo "$@"' 0 1 2 3 4 +$THIS_SH -c 'shift 6; echo "$@"' 0 1 2 3 4 -- cgit v1.2.3