summaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
authorDenys Vlasenko2017-07-18 01:40:01 +0200
committerDenys Vlasenko2017-07-18 01:40:01 +0200
commit38ef39a1abd46ca390b0259ebd0b35e9ea9ccb68 (patch)
tree7c2f7de98cd1a7b467be6529eff98c23b999af17 /shell/hush.c
parent3bab36b18baa0dc254445828f492051450a38d41 (diff)
downloadbusybox-38ef39a1abd46ca390b0259ebd0b35e9ea9ccb68.zip
busybox-38ef39a1abd46ca390b0259ebd0b35e9ea9ccb68.tar.gz
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/hush.c')
-rw-r--r--shell/hush.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 7771172..eab1284 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -7767,10 +7767,10 @@ static NOINLINE int run_pipe(struct pipe *pi)
if (new_env) {
argv = new_env;
while (*argv) {
- set_local_var(*argv, /*flag:*/ 0);
- /* Do we need to flag set_local_var() errors?
- * "assignment to readonly var" and "putenv error"
- */
+ if (set_local_var(*argv, /*flag:*/ 0)) {
+ /* assignment to readonly var / putenv error? */
+ rcode = 1;
+ }
argv++;
}
}
@@ -7795,10 +7795,10 @@ static NOINLINE int run_pipe(struct pipe *pi)
fprintf(stderr, " %s", p);
debug_printf_exec("set shell var:'%s'->'%s'\n",
*argv, p);
- set_local_var(p, /*flag:*/ 0);
- /* Do we need to flag set_local_var() errors?
- * "assignment to readonly var" and "putenv error"
- */
+ if (set_local_var(p, /*flag:*/ 0)) {
+ /* assignment to readonly var / putenv error? */
+ rcode = 1;
+ }
argv++;
}
if (G_x_mode)
@@ -9336,6 +9336,13 @@ static int helper_export_local(char **argv, unsigned flags)
continue;
}
}
+ if (flags & SETFLAG_MAKE_RO) {
+ /* readonly NAME (without =VALUE) */
+ if (var) {
+ var->flg_read_only = 1;
+ continue;
+ }
+ }
# if ENABLE_HUSH_LOCAL
/* Is this "local" bltin? */
if (!(flags & (SETFLAG_EXPORT|SETFLAG_UNEXPORT|SETFLAG_MAKE_RO))) {
@@ -9364,7 +9371,8 @@ static int helper_export_local(char **argv, unsigned flags)
/* (Un)exporting/making local NAME=VALUE */
name = xstrdup(name);
}
- set_local_var(name, flags);
+ if (set_local_var(name, flags))
+ return EXIT_FAILURE;
} while (*++argv);
return EXIT_SUCCESS;
}