summaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
authorDenys Vlasenko2019-09-05 14:07:14 +0200
committerDenys Vlasenko2019-09-05 14:07:14 +0200
commit18a90ec846f4c19b3309022d308065237145e7ce (patch)
tree7f0687d1cba6222092744b9be0d13dbf0bff5ee5 /shell/hush.c
parent750137ef7ce3d21511b4638d25a4fce0a811b60a (diff)
downloadbusybox-18a90ec846f4c19b3309022d308065237145e7ce.zip
busybox-18a90ec846f4c19b3309022d308065237145e7ce.tar.gz
hush: fix "set -o INVALID" affecting -e flag state
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/hush.c')
-rw-r--r--shell/hush.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 19b97e2..96a9358 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -9824,9 +9824,12 @@ static int set_mode(int state, char mode, const char *o_opt)
IF_HUSH_MODE_X(G_x_mode = state;)
IF_HUSH_MODE_X(if (G.x_mode_fd <= 0) G.x_mode_fd = dup_CLOEXEC(2, 10);)
break;
+ case 'e':
+ G.o_opt[OPT_O_ERREXIT] = state;
+ break;
case 'o':
if (!o_opt) {
- /* "set -+o" without parameter.
+ /* "set -o" or "set +o" without parameter.
* in bash, set -o produces this output:
* pipefail off
* and set +o:
@@ -9847,9 +9850,7 @@ static int set_mode(int state, char mode, const char *o_opt)
G.o_opt[idx] = state;
break;
}
- case 'e':
- G.o_opt[OPT_O_ERREXIT] = state;
- break;
+ /* fall through to error */
default:
return EXIT_FAILURE;
}
@@ -10931,8 +10932,10 @@ static int FAST_FUNC builtin_set(char **argv)
if (arg[0] != '+' && arg[0] != '-')
break;
for (n = 1; arg[n]; ++n) {
- if (set_mode((arg[0] == '-'), arg[n], argv[1]))
- goto error;
+ if (set_mode((arg[0] == '-'), arg[n], argv[1])) {
+ bb_error_msg("%s: %s: invalid option", "set", arg);
+ return EXIT_FAILURE;
+ }
if (arg[n] == 'o' && argv[1])
argv++;
}
@@ -10962,11 +10965,6 @@ static int FAST_FUNC builtin_set(char **argv)
G.global_argc = 1 + string_array_len(pp + 1);
return EXIT_SUCCESS;
-
- /* Nothing known, so abort */
- error:
- bb_error_msg("%s: %s: invalid option", "set", arg);
- return EXIT_FAILURE;
}
#endif