diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-18 02:44:06 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-18 02:44:06 +0200 |
commit | 5b2cc0aaee6985431d9bab1b49ceea7e1fa1d7af (patch) | |
tree | 456dfbf0232f7d0b0482bcc2eef96b6085fe98bd /shell/hush.c | |
parent | 38ef39a1abd46ca390b0259ebd0b35e9ea9ccb68 (diff) | |
download | busybox-w32-5b2cc0aaee6985431d9bab1b49ceea7e1fa1d7af.tar.gz busybox-w32-5b2cc0aaee6985431d9bab1b49ceea7e1fa1d7af.tar.bz2 busybox-w32-5b2cc0aaee6985431d9bab1b49ceea7e1fa1d7af.zip |
hush: do not assign to readonly VAR in "VAR=VAL CMD" syntax too
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/shell/hush.c b/shell/hush.c index eab1284f6..55e581e16 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -2089,6 +2089,8 @@ static int set_local_var(char *str, unsigned flags) | |||
2089 | if (cur->flg_read_only) { | 2089 | if (cur->flg_read_only) { |
2090 | bb_error_msg("%s: readonly variable", str); | 2090 | bb_error_msg("%s: readonly variable", str); |
2091 | free(str); | 2091 | free(str); |
2092 | //NOTE: in bash, assignment in "export READONLY_VAR=Z" fails, and sets $?=1, | ||
2093 | //but export per se succeeds (does put the var in env). We don't mimic that. | ||
2092 | return -1; | 2094 | return -1; |
2093 | } | 2095 | } |
2094 | if (flags & SETFLAG_UNEXPORT) { // && cur->flg_export ? | 2096 | if (flags & SETFLAG_UNEXPORT) { // && cur->flg_export ? |
@@ -2283,8 +2285,12 @@ static struct variable *set_vars_and_save_old(char **strings) | |||
2283 | if (eq) { | 2285 | if (eq) { |
2284 | var_pp = get_ptr_to_local_var(*s, eq - *s); | 2286 | var_pp = get_ptr_to_local_var(*s, eq - *s); |
2285 | if (var_pp) { | 2287 | if (var_pp) { |
2286 | /* Remove variable from global linked list */ | ||
2287 | var_p = *var_pp; | 2288 | var_p = *var_pp; |
2289 | if (var_p->flg_read_only) { | ||
2290 | bb_error_msg("%s: readonly variable", *s); | ||
2291 | goto next; | ||
2292 | } | ||
2293 | /* Remove variable from global linked list */ | ||
2288 | debug_printf_env("%s: removing '%s'\n", __func__, var_p->varstr); | 2294 | debug_printf_env("%s: removing '%s'\n", __func__, var_p->varstr); |
2289 | *var_pp = var_p->next; | 2295 | *var_pp = var_p->next; |
2290 | /* Add it to returned list */ | 2296 | /* Add it to returned list */ |
@@ -2293,6 +2299,7 @@ static struct variable *set_vars_and_save_old(char **strings) | |||
2293 | } | 2299 | } |
2294 | set_local_var(*s, SETFLAG_EXPORT); | 2300 | set_local_var(*s, SETFLAG_EXPORT); |
2295 | } | 2301 | } |
2302 | next: | ||
2296 | s++; | 2303 | s++; |
2297 | } | 2304 | } |
2298 | return old; | 2305 | return old; |