diff options
-rwxr-xr-x | shell/ash_test/ash-misc/shift1.tests | 2 | ||||
-rw-r--r-- | shell/hush.c | 13 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/shift1.right | 10 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/shift1.tests | 10 |
4 files changed, 33 insertions, 2 deletions
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 @@ | |||
1 | $THIS_SH -c 'shift; echo "$@"' 0 1 2 3 4 | 1 | $THIS_SH -c 'shift; echo "$@"' 0 1 2 3 4 |
2 | #We do abort on -1, but then we abort. bash executes echo. | 2 | # We do complain on -1, but then we abort. bash executes echo. |
3 | $THIS_SH -c 'shift -1; echo "$@"' 0 1 2 3 4 | 3 | $THIS_SH -c 'shift -1; echo "$@"' 0 1 2 3 4 |
4 | $THIS_SH -c 'shift 0; echo "$@"' 0 1 2 3 4 | 4 | $THIS_SH -c 'shift 0; echo "$@"' 0 1 2 3 4 |
5 | $THIS_SH -c 'shift 1; echo "$@"' 0 1 2 3 4 | 5 | $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) | |||
9377 | int n = 1; | 9377 | int n = 1; |
9378 | argv = skip_dash_dash(argv); | 9378 | argv = skip_dash_dash(argv); |
9379 | if (argv[0]) { | 9379 | if (argv[0]) { |
9380 | n = atoi(argv[0]); | 9380 | n = bb_strtou(argv[0], NULL, 10); |
9381 | if (errno || n < 0) { | ||
9382 | /* shared string with ash.c */ | ||
9383 | bb_error_msg("Illegal number: %s", argv[0]); | ||
9384 | /* | ||
9385 | * ash aborts in this case. | ||
9386 | * bash prints error message and set $? to 1. | ||
9387 | * Interestingly, for "shift 99999" bash does not | ||
9388 | * print error message, but does set $? to 1 | ||
9389 | * (and does no shifting at all). | ||
9390 | */ | ||
9391 | } | ||
9381 | } | 9392 | } |
9382 | if (n >= 0 && n < G.global_argc) { | 9393 | if (n >= 0 && n < G.global_argc) { |
9383 | if (G_global_args_malloced) { | 9394 | 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 @@ | |||
1 | 2 3 4 | ||
2 | hush: Illegal number: -1 | ||
3 | 1 2 3 4 | ||
4 | 1 2 3 4 | ||
5 | 2 3 4 | ||
6 | 3 4 | ||
7 | 4 | ||
8 | |||
9 | 1 2 3 4 | ||
10 | 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 @@ | |||
1 | $THIS_SH -c 'shift; echo "$@"' 0 1 2 3 4 | ||
2 | #We complain on -1 and continue. | ||
3 | $THIS_SH -c 'shift -1; echo "$@"' 0 1 2 3 4 | ||
4 | $THIS_SH -c 'shift 0; echo "$@"' 0 1 2 3 4 | ||
5 | $THIS_SH -c 'shift 1; echo "$@"' 0 1 2 3 4 | ||
6 | $THIS_SH -c 'shift 2; echo "$@"' 0 1 2 3 4 | ||
7 | $THIS_SH -c 'shift 3; echo "$@"' 0 1 2 3 4 | ||
8 | $THIS_SH -c 'shift 4; echo "$@"' 0 1 2 3 4 | ||
9 | $THIS_SH -c 'shift 5; echo "$@"' 0 1 2 3 4 | ||
10 | $THIS_SH -c 'shift 6; echo "$@"' 0 1 2 3 4 | ||