From: Michael Meyer Date: Fri, 7 Oct 2022 17:18:14 +0000 (-0400) Subject: Fix: error handling for invalid autounlock value X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=883f973f5641205bb4d6ae6cbdbfac0a2566e0c4;p=nethack Fix: error handling for invalid autounlock value 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. --- diff --git a/src/options.c b/src/options.c index 83895b8f1..30efd23e2 100644 --- a/src/options.c +++ b/src/options.c @@ -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) {