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.rep...@gmx.net>
Reviewed-by: Simon Horman <ho...@kernel.org>
---
Changes v7 -> v8
  - rebased on actual net-next/main
  - fix c99 comment (suggested by Paolo Abeni)

Changes v6 -> v7
  - rebased on actual net-next/main
  - no changes

Changes v5 -> v6
  - no changes

Changes v4 -> v5
  - split up patchset into part i/ii (suggested by Simon Horman)

Changes v3 -> v4
  - add rev-by Simon Horman

Changes v2 -> v3:
  - new patch
---
 net/core/pktgen.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

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;
-- 
2.48.1

Reply via email to