aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2025-02-19 14:14:27 +1100
committerStefano Brivio <sbrivio@redhat.com>2025-02-19 06:35:38 +0100
commit3dc7da68a2731f661d7251a5fc759daffe24ca70 (patch)
tree2c4f4909f08ad59ac07ffda4adfa17b0b8bf88a0
parent65e317a8fca4eaf9efbfe642cc7e4322c56aa1f7 (diff)
downloadpasst-3dc7da68a2731f661d7251a5fc759daffe24ca70.tar
passt-3dc7da68a2731f661d7251a5fc759daffe24ca70.tar.gz
passt-3dc7da68a2731f661d7251a5fc759daffe24ca70.tar.bz2
passt-3dc7da68a2731f661d7251a5fc759daffe24ca70.tar.lz
passt-3dc7da68a2731f661d7251a5fc759daffe24ca70.tar.xz
passt-3dc7da68a2731f661d7251a5fc759daffe24ca70.tar.zst
passt-3dc7da68a2731f661d7251a5fc759daffe24ca70.zip
conf: More thorough error checking when parsing --mtu option
We're a bit sloppy with parsing MTU which can lead to some surprising, though fairly harmless, results: * Passing a non-number like '-m xyz' will not give an error and act like -m 0 * Junk after a number (e.g. '-m 1500pqr') will be ignored rather than giving an error * We parse the MTU as a long, then immediately assign to an int, so on some platforms certain ludicrously out of bounds values will be silently truncated, rather than giving an error Be a bit more thorough with the error checking to avoid that. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--conf.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/conf.c b/conf.c
index 18017f5..335f37c 100644
--- a/conf.c
+++ b/conf.c
@@ -1652,20 +1652,29 @@ void conf(struct ctx *c, int argc, char **argv)
die("Invalid PID file: %s", optarg);
break;
- case 'm':
+ case 'm': {
+ unsigned long mtu;
+ char *e;
+
errno = 0;
- c->mtu = strtol(optarg, NULL, 0);
+ mtu = strtoul(optarg, &e, 0);
+
+ if (errno || *e)
+ die("Invalid MTU: %s", optarg);
- if (!c->mtu) {
+ if (!mtu) {
c->mtu = -1;
break;
}
- if (c->mtu < ETH_MIN_MTU || c->mtu > (int)ETH_MAX_MTU ||
- errno)
- die("Invalid MTU: %s", optarg);
+ if (mtu < ETH_MIN_MTU || mtu > ETH_MAX_MTU) {
+ die("MTU %lu out of range (%u..%u)", mtu,
+ ETH_MIN_MTU, ETH_MAX_MTU);
+ }
+ c->mtu = mtu;
break;
+ }
case 'a':
if (inet_pton(AF_INET6, optarg, &c->ip6.addr) &&
!IN6_IS_ADDR_UNSPECIFIED(&c->ip6.addr) &&