]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
netdev-genl: fix error codes when outputting XDP features
authorJakub Kicinski <kuba@kernel.org>
Thu, 13 Jun 2024 21:30:44 +0000 (14:30 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 15 Jun 2024 01:04:29 +0000 (18:04 -0700)
-EINVAL will interrupt the dump. The correct error to return
if we have more data to dump is -EMSGSIZE.

Discovered by doing:

  for i in `seq 80`; do ip link add type veth; done
  ./cli.py --dbg-small-recv 5300 --spec netdev.yaml --dump dev-get >> /dev/null
  [...]
     nl_len = 64 (48) nl_flags = 0x0 nl_type = 19
     nl_len = 20 (4) nl_flags = 0x2 nl_type = 3
   error: -22

Fixes: d3d854fd6a1d ("netdev-genl: create a simple family for netdev stuff")
Reviewed-by: Amritha Nambiar <amritha.nambiar@intel.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20240613213044.3675745-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/netdev-genl.c

index 1f6ae6379e0fc202e15fb7c4820c72236183f137..05f9515d2c05c11b1436cf4e35b3d5f5ff26abb9 100644 (file)
@@ -59,22 +59,22 @@ XDP_METADATA_KFUNC_xxx
            nla_put_u64_64bit(rsp, NETDEV_A_DEV_XDP_RX_METADATA_FEATURES,
                              xdp_rx_meta, NETDEV_A_DEV_PAD) ||
            nla_put_u64_64bit(rsp, NETDEV_A_DEV_XSK_FEATURES,
-                             xsk_features, NETDEV_A_DEV_PAD)) {
-               genlmsg_cancel(rsp, hdr);
-               return -EINVAL;
-       }
+                             xsk_features, NETDEV_A_DEV_PAD))
+               goto err_cancel_msg;
 
        if (netdev->xdp_features & NETDEV_XDP_ACT_XSK_ZEROCOPY) {
                if (nla_put_u32(rsp, NETDEV_A_DEV_XDP_ZC_MAX_SEGS,
-                               netdev->xdp_zc_max_segs)) {
-                       genlmsg_cancel(rsp, hdr);
-                       return -EINVAL;
-               }
+                               netdev->xdp_zc_max_segs))
+                       goto err_cancel_msg;
        }
 
        genlmsg_end(rsp, hdr);
 
        return 0;
+
+err_cancel_msg:
+       genlmsg_cancel(rsp, hdr);
+       return -EMSGSIZE;
 }
 
 static void