net: pktgen: fix mpls reset parsing
authorPeter Seiderer <ps.report@gmx.net>
Thu, 27 Feb 2025 13:56:02 +0000 (14:56 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 4 Mar 2025 09:57:58 +0000 (10:57 +0100)
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: 0000000100000002
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: 0000000100000002
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>
net/core/pktgen.c

index f4f9c9d..c604a68 100644 (file)
@@ -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;