Attention is currently required from: plaisthos.
Hello plaisthos,
I'd like you to do a code review.
Please visit
http://gerrit.openvpn.net/c/openvpn/+/1154?usp=email
to review the following change.
Change subject: options: Factor out usages of strtoll and atoll
......................................................................
options: Factor out usages of strtoll and atoll
This covers the cases where we actually want to
allow numbers > 2^31
Change-Id: I454126b3f8fa9d14501f6c4b1ed9ce7b2904be61
Signed-off-by: Frank Lichtenheld <[email protected]>
---
M src/openvpn/options.c
M src/openvpn/options_util.c
M src/openvpn/options_util.h
M tests/unit_tests/openvpn/test_misc.c
4 files changed, 41 insertions(+), 12 deletions(-)
git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/54/1154/1
diff --git a/src/openvpn/options.c b/src/openvpn/options.c
index 7c685e2..6e97ae4 100644
--- a/src/openvpn/options.c
+++ b/src/openvpn/options.c
@@ -7181,8 +7181,7 @@
options->inactivity_timeout = positive_atoi(p[1], msglevel);
if (p[2])
{
- int64_t val = atoll(p[2]);
- options->inactivity_minimum_bytes = (val < 0) ? 0 : val;
+ positive_atoll(p[2], &options->inactivity_minimum_bytes, p[0],
msglevel);
if (options->inactivity_minimum_bytes > INT_MAX)
{
msg(M_WARN,
@@ -9528,26 +9527,18 @@
else if (streq(p[0], "reneg-bytes") && p[1] && !p[2])
{
VERIFY_PERMISSION(OPT_P_TLS_PARMS);
- char *end;
- long long reneg_bytes = strtoll(p[1], &end, 10);
- if (*end != '\0' || reneg_bytes < 0)
+ if (!positive_atoll(p[1], &options->renegotiate_bytes, p[0], msglevel))
{
- msg(msglevel, "--reneg-bytes parameter must be an integer and >=
0");
goto err;
}
- options->renegotiate_bytes = reneg_bytes;
}
else if (streq(p[0], "reneg-pkts") && p[1] && !p[2])
{
VERIFY_PERMISSION(OPT_P_TLS_PARMS);
- char *end;
- long long pkt_max = strtoll(p[1], &end, 10);
- if (*end != '\0' || pkt_max < 0)
+ if (!positive_atoll(p[1], &options->renegotiate_packets, p[0],
msglevel))
{
- msg(msglevel, "--reneg-pkts parameter must be an integer and >=
0");
goto err;
}
- options->renegotiate_packets = pkt_max;
}
else if (streq(p[0], "reneg-sec") && p[1] && !p[3])
{
diff --git a/src/openvpn/options_util.c b/src/openvpn/options_util.c
index 32a9edb..e930078 100644
--- a/src/openvpn/options_util.c
+++ b/src/openvpn/options_util.c
@@ -131,6 +131,22 @@
return (int)i;
}
+bool
+positive_atoll(const char *str, int64_t *value, const char *name, int msglevel)
+{
+ char *endptr;
+ long long ll = strtoll(str, &endptr, 10);
+
+ if (ll < 0 || *endptr != '\0')
+ {
+ msg(msglevel, "%s: Cannot parse '%s' as non-negative integer", name,
str);
+ return false;
+ }
+
+ *value = (int64_t)ll;
+ return true;
+}
+
int
atoi_warn(const char *str, int msglevel)
{
diff --git a/src/openvpn/options_util.h b/src/openvpn/options_util.h
index b9e1569..5d38eda 100644
--- a/src/openvpn/options_util.h
+++ b/src/openvpn/options_util.h
@@ -41,6 +41,17 @@
/**
* Converts a str to an integer if the string can be represented as an
+ * integer number and is >= 0.
+ * The integer is stored in \p value.
+ * On error, print a warning with \p msglevel using \p name. \p value is
+ * not changed on error.
+ *
+ * @return \c true if the integer has been parsed and stored in value, \c
false otherwise
+ */
+bool positive_atoll(const char *str, int64_t *value, const char *name, int
msglevel);
+
+/**
+ * Converts a str to an integer if the string can be represented as an
* integer number. Otherwise print a warning with \p msglevel and return 0
*/
int atoi_warn(const char *str, int msglevel);
diff --git a/tests/unit_tests/openvpn/test_misc.c
b/tests/unit_tests/openvpn/test_misc.c
index 2d2cc9e..ff96644 100644
--- a/tests/unit_tests/openvpn/test_misc.c
+++ b/tests/unit_tests/openvpn/test_misc.c
@@ -359,6 +359,17 @@
assert_true(atoi_constrained("-1194", ¶meter, "test", INT_MIN,
INT_MAX, msglevel));
assert_int_equal(parameter, -1194);
+ int64_t parameter64 = 0;
+ assert_true(positive_atoll("1234", ¶meter64, "test", msglevel));
+ assert_int_equal(parameter64, 1234);
+ assert_true(positive_atoll("0", ¶meter64, "test", msglevel));
+ assert_int_equal(parameter64, 0);
+ assert_true(positive_atoll("2147483653", ¶meter64, "test", msglevel));
+ assert_int_equal(parameter64, 2147483653);
+ /* overflow gets capped to LLONG_MAX */
+ assert_true(positive_atoll("9223372036854775810", ¶meter64, "test",
msglevel));
+ assert_int_equal(parameter64, 9223372036854775807);
+
CLEAR(mock_msg_buf);
assert_int_equal(positive_atoi("-1234", msglevel), 0);
assert_string_equal(mock_msg_buf, "Cannot parse argument '-1234' as
non-negative integer");
--
To view, visit http://gerrit.openvpn.net/c/openvpn/+/1154?usp=email
To unsubscribe, or for help writing mail filters, visit
http://gerrit.openvpn.net/settings
Gerrit-Project: openvpn
Gerrit-Branch: master
Gerrit-Change-Id: I454126b3f8fa9d14501f6c4b1ed9ce7b2904be61
Gerrit-Change-Number: 1154
Gerrit-PatchSet: 1
Gerrit-Owner: flichtenheld <[email protected]>
Gerrit-Reviewer: plaisthos <[email protected]>
Gerrit-CC: openvpn-devel <[email protected]>
Gerrit-Attention: plaisthos <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel