diff options
author | Denys Vlasenko | 2019-09-05 14:07:14 +0200 |
---|---|---|
committer | Denys Vlasenko | 2019-10-21 16:54:40 +0200 |
commit | a1c7a9e976f8e15d54d9232c2a6aa9fcda603f1b (patch) | |
tree | bf8dcaaf0db0537e65ab49e2383993a90480bedc | |
parent | 2f3352682e3e0f62aca80c12e64d4509e48df465 (diff) | |
download | busybox-a1c7a9e976f8e15d54d9232c2a6aa9fcda603f1b.zip busybox-a1c7a9e976f8e15d54d9232c2a6aa9fcda603f1b.tar.gz |
hush: fix "set -o INVALID" affecting -e flag state
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/hush.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/shell/hush.c b/shell/hush.c index f82747f..8d9ab24 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 |