@@ -7748,7 +7748,7 @@
{
VERIFY_PERMISSION(OPT_P_GENERAL);
options->sc_info.challenge_text = p[1];
- if (atoi_warn(p[2], msglevel))
+ if (boolean_flag(p[2], "static-challenge echo", msglevel))
{
options->sc_info.flags |= SC_ECHO;
}
@@ -8123,7 +8123,7 @@
options->exit_event_name = p[1];
if (p[2])
{
- options->exit_event_initial_state = (atoi_warn(p[2], msglevel) != 0);
+ options->exit_event_initial_state = boolean_flag(p[2], "service state", msglevel);
}
}
else if (streq(p[0], "allow-nonadmin") && !p[2])
@@ -9080,7 +9080,8 @@
else if (streq(p[0], "show-pkcs11-ids") && !p[3])
{
char *provider = p[1];
- bool cert_private = (p[2] == NULL ? false : (atoi_warn(p[2], msglevel) != 0));
+ bool cert_private = (p[2] == NULL ? false
+ : boolean_flag(p[2], "show-pkcs11-ids private", msglevel));
#ifdef DEFAULT_PKCS11_MODULE
if (!provider)
@@ -9126,14 +9127,12 @@
}
else if (streq(p[0], "pkcs11-protected-authentication"))
{
- int j;
-
VERIFY_PERMISSION(OPT_P_GENERAL);
- for (j = 1; j < MAX_PARMS && p[j] != NULL; ++j)
+ for (int j = 1; j < MAX_PARMS && p[j] != NULL; ++j)
{
options->pkcs11_protected_authentication[j - 1] =
- atoi_warn(p[j], msglevel) != 0 ? 1 : 0;
+ boolean_flag(p[j], p[0], msglevel);
}
}
else if (streq(p[0], "pkcs11-private-mode") && p[1])
@@ -9149,13 +9148,11 @@
}
else if (streq(p[0], "pkcs11-cert-private"))
{
- int j;
-
VERIFY_PERMISSION(OPT_P_GENERAL);
- for (j = 1; j < MAX_PARMS && p[j] != NULL; ++j)
+ for (int j = 1; j < MAX_PARMS && p[j] != NULL; ++j)
{
- options->pkcs11_cert_private[j - 1] = (bool)(atoi_warn(p[j], msglevel));
+ options->pkcs11_cert_private[j - 1] = boolean_flag(p[j], p[0], msglevel);
}
}
else if (streq(p[0], "pkcs11-pin-cache") && p[1] && !p[2])
@@ -193,6 +193,14 @@
return true;
}
+bool
+boolean_flag(const char *str, const char *name, msglvl_t msglevel)
+{
+ int number = 0;
+ atoi_constrained(str, &number, name, 0, 1, msglevel);
+ return (bool)number;
+}
+
static const char *updatable_options[] = { "block-ipv6", "block-outside-dns",
"dhcp-option", "dns",
"ifconfig", "ifconfig-ipv6",
@@ -69,6 +69,12 @@
msglvl_t msglevel);
/**
+ * Converts a str to an boolean if the string can be parsed as either 0 or 1.
+ * Otherwise print a warning with \p msglevel and return \c false.
+ */
+bool boolean_flag(const char *str, const char *name, msglvl_t msglevel);
+
+/**
* Filter an option line by all pull filters.
*
* If a match is found, the line is modified depending on
@@ -442,6 +442,22 @@
assert_string_equal(mock_msg_buf, "test: Must be an integer >= 1, not 0");
assert_int_equal(parameter, -42);
+ /* special tests for boolean_flag */
+ assert_false(boolean_flag("0", "test", msglevel));
+ assert_true(boolean_flag("1", "test", msglevel));
+
+ CLEAR(mock_msg_buf);
+ assert_false(boolean_flag("foo77", "test", msglevel));
+ assert_string_equal(mock_msg_buf, "test: Cannot parse 'foo77' as integer");
+
+ CLEAR(mock_msg_buf);
+ assert_false(boolean_flag("-77", "test", msglevel));
+ assert_string_equal(mock_msg_buf, "test: Must be an integer between 0 and 1, not -77");
+
+ CLEAR(mock_msg_buf);
+ assert_false(boolean_flag("77", "test", msglevel));
+ assert_string_equal(mock_msg_buf, "test: Must be an integer between 0 and 1, not 77");
+
mock_set_debug_level(saved_log_level);
}