diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-18 01:40:01 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-18 01:40:01 +0200 |
| commit | 38ef39a1abd46ca390b0259ebd0b35e9ea9ccb68 (patch) | |
| tree | 7c2f7de98cd1a7b467be6529eff98c23b999af17 /shell | |
| parent | 3bab36b18baa0dc254445828f492051450a38d41 (diff) | |
| download | busybox-w32-38ef39a1abd46ca390b0259ebd0b35e9ea9ccb68.tar.gz busybox-w32-38ef39a1abd46ca390b0259ebd0b35e9ea9ccb68.tar.bz2 busybox-w32-38ef39a1abd46ca390b0259ebd0b35e9ea9ccb68.zip | |
hush: add readonly testcase, fix fallout
function old new delta
helper_export_local 185 214 +29
run_pipe 1549 1560 +11
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 40/0) Total: 40 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/hush.c | 26 | ||||
| -rw-r--r-- | shell/hush_test/hush-vars/readonly0.right | 12 | ||||
| -rwxr-xr-x | shell/hush_test/hush-vars/readonly0.tests | 24 |
3 files changed, 53 insertions, 9 deletions
diff --git a/shell/hush.c b/shell/hush.c index 7771172b6..eab1284f6 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
| @@ -7767,10 +7767,10 @@ static NOINLINE int run_pipe(struct pipe *pi) | |||
| 7767 | if (new_env) { | 7767 | if (new_env) { |
| 7768 | argv = new_env; | 7768 | argv = new_env; |
| 7769 | while (*argv) { | 7769 | while (*argv) { |
| 7770 | set_local_var(*argv, /*flag:*/ 0); | 7770 | if (set_local_var(*argv, /*flag:*/ 0)) { |
| 7771 | /* Do we need to flag set_local_var() errors? | 7771 | /* assignment to readonly var / putenv error? */ |
| 7772 | * "assignment to readonly var" and "putenv error" | 7772 | rcode = 1; |
| 7773 | */ | 7773 | } |
| 7774 | argv++; | 7774 | argv++; |
| 7775 | } | 7775 | } |
| 7776 | } | 7776 | } |
| @@ -7795,10 +7795,10 @@ static NOINLINE int run_pipe(struct pipe *pi) | |||
| 7795 | fprintf(stderr, " %s", p); | 7795 | fprintf(stderr, " %s", p); |
| 7796 | debug_printf_exec("set shell var:'%s'->'%s'\n", | 7796 | debug_printf_exec("set shell var:'%s'->'%s'\n", |
| 7797 | *argv, p); | 7797 | *argv, p); |
| 7798 | set_local_var(p, /*flag:*/ 0); | 7798 | if (set_local_var(p, /*flag:*/ 0)) { |
| 7799 | /* Do we need to flag set_local_var() errors? | 7799 | /* assignment to readonly var / putenv error? */ |
| 7800 | * "assignment to readonly var" and "putenv error" | 7800 | rcode = 1; |
| 7801 | */ | 7801 | } |
| 7802 | argv++; | 7802 | argv++; |
| 7803 | } | 7803 | } |
| 7804 | if (G_x_mode) | 7804 | if (G_x_mode) |
| @@ -9336,6 +9336,13 @@ static int helper_export_local(char **argv, unsigned flags) | |||
| 9336 | continue; | 9336 | continue; |
| 9337 | } | 9337 | } |
| 9338 | } | 9338 | } |
| 9339 | if (flags & SETFLAG_MAKE_RO) { | ||
| 9340 | /* readonly NAME (without =VALUE) */ | ||
| 9341 | if (var) { | ||
| 9342 | var->flg_read_only = 1; | ||
| 9343 | continue; | ||
| 9344 | } | ||
| 9345 | } | ||
| 9339 | # if ENABLE_HUSH_LOCAL | 9346 | # if ENABLE_HUSH_LOCAL |
| 9340 | /* Is this "local" bltin? */ | 9347 | /* Is this "local" bltin? */ |
| 9341 | if (!(flags & (SETFLAG_EXPORT|SETFLAG_UNEXPORT|SETFLAG_MAKE_RO))) { | 9348 | if (!(flags & (SETFLAG_EXPORT|SETFLAG_UNEXPORT|SETFLAG_MAKE_RO))) { |
| @@ -9364,7 +9371,8 @@ static int helper_export_local(char **argv, unsigned flags) | |||
| 9364 | /* (Un)exporting/making local NAME=VALUE */ | 9371 | /* (Un)exporting/making local NAME=VALUE */ |
| 9365 | name = xstrdup(name); | 9372 | name = xstrdup(name); |
| 9366 | } | 9373 | } |
| 9367 | set_local_var(name, flags); | 9374 | if (set_local_var(name, flags)) |
| 9375 | return EXIT_FAILURE; | ||
| 9368 | } while (*++argv); | 9376 | } while (*++argv); |
| 9369 | return EXIT_SUCCESS; | 9377 | return EXIT_SUCCESS; |
| 9370 | } | 9378 | } |
diff --git a/shell/hush_test/hush-vars/readonly0.right b/shell/hush_test/hush-vars/readonly0.right new file mode 100644 index 000000000..9688d2e5f --- /dev/null +++ b/shell/hush_test/hush-vars/readonly0.right | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | readonly a=A | ||
| 2 | readonly b=B | ||
| 3 | Ok:0 | ||
| 4 | hush: a=A: readonly variable | ||
| 5 | Fail:1 | ||
| 6 | hush: a=A: readonly variable | ||
| 7 | Fail:1 | ||
| 8 | hush: a=A: readonly variable | ||
| 9 | Fail:1 | ||
| 10 | Visible:0 | ||
| 11 | hush: a: readonly variable | ||
| 12 | Fail:1 | ||
diff --git a/shell/hush_test/hush-vars/readonly0.tests b/shell/hush_test/hush-vars/readonly0.tests new file mode 100755 index 000000000..3845f76ac --- /dev/null +++ b/shell/hush_test/hush-vars/readonly0.tests | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | readonly a=A | ||
| 2 | b=B | ||
| 3 | readonly b | ||
| 4 | # readonly on already readonly var is harmless | ||
| 5 | readonly b a | ||
| 6 | readonly | grep '^readonly [ab]=' | ||
| 7 | # this should work | ||
| 8 | export a b | ||
| 9 | export -n a b | ||
| 10 | echo Ok:$? | ||
| 11 | env | grep -e^a= -e^b= # shows nothing | ||
| 12 | |||
| 13 | # these should all fail (despite the same value being assigned) | ||
| 14 | # bash does not abort even in non-interactive more (in script) | ||
| 15 | true | ||
| 16 | a=A | ||
| 17 | echo Fail:$?; true | ||
| 18 | readonly a=A | ||
| 19 | echo Fail:$?; true | ||
| 20 | export a=A | ||
| 21 | echo Fail:$?; true | ||
| 22 | a=A echo Visible:$? # command still runs | ||
| 23 | unset a | ||
| 24 | echo Fail:$?; true | ||
