]> granicus.if.org Git - nethack/commitdiff
Fix: error handling for invalid autounlock value
authorMichael Meyer <me@entrez.cc>
Fri, 7 Oct 2022 17:18:14 +0000 (13:18 -0400)
committerPatR <rankin@nethack.org>
Thu, 13 Oct 2022 00:02:15 +0000 (17:02 -0700)
Because the existing error was the default case in a switch/case
statement only reachable if the option matched one of the expected ones
in the list, it wasn't actually reachable: something totally out of
left-field wouldn't match one of the expected options so never hit the
switch, and something that did match one of the expected options would
by definition have a first character handled by one of the cases in the
switch/case.

Do it a slightly different way that should successfully raise an
unexpected value error for 'OPTIONS=autounlock:foobar'.  I didn't remove
the default case entirely, because it could still catch an error if
some new value is added to unlocktypes[] without a corresponding case
being added to the switch statement.

src/options.c

index 83895b8f13529c8e1bf2e65fb2e1c3c1e070060c..30efd23e2f8c8728303dda8178726b59964f620a 100644 (file)
@@ -775,6 +775,7 @@ optfn_autounlock(
         newflags = 0;
         sep = index(op, '+') ? '+' : ' ';
         while (op) {
+            boolean matched = FALSE;
             op = trimspaces(op); /* might have leading space */
             if ((nxt = index(op, sep)) != 0) {
                 *nxt++ = '\0';
@@ -782,13 +783,14 @@ optfn_autounlock(
                                       * plus sign removal */
             }
             if (str_start_is("none", op, TRUE))
-                negated = TRUE;
-            for (i = 0; i < SIZE(unlocktypes); ++i) {
+                negated = TRUE, matched = TRUE;
+            for (i = 0; i < SIZE(unlocktypes) && !matched; ++i) {
                 if (str_start_is(unlocktypes[i][0], op, TRUE)
                     /* fuzzymatch() doesn't match leading substrings but
                        this allows "apply_key" and "applykey" to match
                        "apply-key"; "apply key" too if part of foo+bar */
                     || fuzzymatch(op, unlocktypes[i][0], " -_", TRUE)) {
+                    matched = TRUE;
                     switch (*op) {
                     case 'n':
                         negated = TRUE;
@@ -806,12 +808,16 @@ optfn_autounlock(
                         newflags |= AUTOUNLOCK_FORCE;
                         break;
                     default:
-                        config_error_add("Invalid value for \"%s\": \"%s\"",
-                                         allopt[optidx].name, op);
-                        return optn_silenterr;
+                        matched = FALSE;
+                        break;
                     }
                 }
             }
+            if (!matched) {
+                config_error_add("Invalid value for \"%s\": \"%s\"",
+                                 allopt[optidx].name, op);
+                return optn_silenterr;
+            }
             op = nxt;
         }
         if (negated && newflags != 0) {