hush: fix "set -o INVALID" affecting -e flag state
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 5 Sep 2019 12:07:14 +0000 (14:07 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 21 Oct 2019 14:54:40 +0000 (16:54 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/hush.c

index f82747f74bedc8e3a8a80adb782694066dd090a0..8d9ab244e50c3de98ae473c59d173f3be380abfd 100644 (file)
@@ -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