diff options
author | 2025-02-27 14:56:02 +0100 | |
---|---|---|
committer | 2025-03-04 10:57:58 +0100 | |
commit | 4bedafa7474ead37bdf31f19a7268ab1a14a7388 (patch) | |
tree | 0ba97eaf4c2d911596a684e3541a05769a04dedf | |
parent | net: pktgen: fix access outside of user given buffer in pktgen_if_write() (diff) | |
download | wireguard-linux-4bedafa7474ead37bdf31f19a7268ab1a14a7388.tar.xz wireguard-linux-4bedafa7474ead37bdf31f19a7268ab1a14a7388.zip |
net: pktgen: fix mpls reset parsing
Fix mpls list reset parsing to work as describe in
Documentation/networking/pktgen.rst:
pgset "mpls 0" turn off mpls (or any invalid argument works too!)
- before the patch
$ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0
$ grep mpls /proc/net/pktgen/lo\@0
mpls: 00000001, 00000002
Result: OK: mpls=00000001,00000002
$ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0
$ echo "mpls 0" > /proc/net/pktgen/lo\@0
$ grep mpls /proc/net/pktgen/lo\@0
mpls: 00000000
Result: OK: mpls=00000000
$ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0
$ echo "mpls invalid" > /proc/net/pktgen/lo\@0
$ grep mpls /proc/net/pktgen/lo\@0
Result: OK: mpls=
- after the patch
$ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0
$ grep mpls /proc/net/pktgen/lo\@0
mpls: 00000001, 00000002
Result: OK: mpls=00000001,00000002
$ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0
$ echo "mpls 0" > /proc/net/pktgen/lo\@0
$ grep mpls /proc/net/pktgen/lo\@0
Result: OK: mpls=
$ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0
$ echo "mpls invalid" > /proc/net/pktgen/lo\@0
$ grep mpls /proc/net/pktgen/lo\@0
Result: OK: mpls=
Signed-off-by: Peter Seiderer <ps.report@gmx.net>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-rw-r--r-- | net/core/pktgen.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index f4f9c9d83694..c604a68f2840 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -913,8 +913,13 @@ static ssize_t get_labels(const char __user *buffer, max = min(8, maxlen - i); len = hex32_arg(&buffer[i], max, &tmp); - if (len <= 0) + if (len < 0) return len; + + /* return empty list in case of invalid input or zero value */ + if (len == 0 || tmp == 0) + return maxlen; + pkt_dev->labels[n] = htonl(tmp); if (pkt_dev->labels[n] & MPLS_STACK_BOTTOM) pkt_dev->flags |= F_MPLS_RND; |