@@ -1598,7 +1598,9 @@
* frame should be <= 1280 and have as much as possible of the original
* packet
*/
- const int max_payload_size = min_int(MAX_ICMPV6LEN, c->c2.frame.tun_mtu - icmpheader_len);
+ int max_payload_size = min_int(MAX_ICMPV6LEN, c->c2.frame.tun_mtu - icmpheader_len);
+ /* Ensure that minimum payload size is at least 64 bytes as extra safety layer */
+ max_payload_size = max_int(max_payload_size, 64);
const int payload_len = min_int(max_payload_size, BLEN(&inputipbuf));
const uint16_t icmp_len = (uint16_t)(sizeof(struct openvpn_icmp6hdr) + payload_len);
@@ -68,6 +68,11 @@
*/
#define TUN_MTU_DEFAULT 1500
+/**
+ * Maximum MTU we accept for MTU related options
+ */
+#define TUN_MTU_MAX 65536
+
/*
* Minimum maximum MTU
*/
@@ -6409,26 +6409,28 @@
else if (streq(p[0], "tun-mtu") && p[1] && !p[3])
{
VERIFY_PERMISSION(OPT_P_PUSH_MTU | OPT_P_CONNECTION);
- options->ce.tun_mtu = positive_atoi(p[1], msglevel);
- options->ce.tun_mtu_defined = true;
- if (p[2])
+ if (atoi_constrained(p[1], &options->ce.tun_mtu, "tun-mtu", TUN_MTU_MIN, TUN_MTU_MAX, msglevel))
{
- options->ce.occ_mtu = positive_atoi(p[2], msglevel);
- }
- else
- {
- options->ce.occ_mtu = 0;
+ options->ce.tun_mtu_defined = true;
+ if (p[2])
+ {
+ atoi_constrained(p[2], &options->ce.occ_mtu, "tun-mtu occ-mtu", TUN_MTU_MIN, TUN_MTU_MAX, msglevel);
+ }
+ else
+ {
+ options->ce.occ_mtu = 0;
+ }
}
}
else if (streq(p[0], "tun-mtu-max") && p[1] && !p[2])
{
VERIFY_PERMISSION(OPT_P_MTU | OPT_P_CONNECTION);
- atoi_constrained(p[1], &options->ce.tun_mtu_max, p[0], TUN_MTU_MAX_MIN, 65536, msglevel);
+ atoi_constrained(p[1], &options->ce.tun_mtu_max, p[0], TUN_MTU_MAX_MIN, TUN_MTU_MAX, msglevel);
}
else if (streq(p[0], "tun-mtu-extra") && p[1] && !p[2])
{
VERIFY_PERMISSION(OPT_P_MTU | OPT_P_CONNECTION);
- if (atoi_constrained(p[1], &options->ce.tun_mtu_extra, p[0], 0, 65536, msglevel))
+ if (atoi_constrained(p[1], &options->ce.tun_mtu_extra, p[0], 0, TUN_MTU_MAX, msglevel))
{
options->ce.tun_mtu_extra_defined = true;
}