xsk: Validate socket state in xsk_recvmsg, prior touching socket members
authorBjörn Töpel <bjorn.topel@intel.com>
Mon, 7 Dec 2020 08:20:08 +0000 (09:20 +0100)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 8 Dec 2020 16:11:58 +0000 (17:11 +0100)
In AF_XDP the socket state needs to be checked, prior touching the
members of the socket. This was not the case for the recvmsg
implementation. Fix that by moving the xsk_is_bound() call.

Fixes: 45a86681844e ("xsk: Add support for recvmsg()")
Reported-by: kernel test robot <oliver.sang@intel.com>
Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
Link: https://lore.kernel.org/bpf/20201207082008.132263-1-bjorn.topel@gmail.com
net/xdp/xsk.c

index 56c46e5f57bcf70ce9a02e131ad27ec701d6f75e..e28c6825e08971cca233d4a339eb540b89b54b77 100644 (file)
@@ -554,12 +554,12 @@ static int xsk_recvmsg(struct socket *sock, struct msghdr *m, size_t len, int fl
        struct sock *sk = sock->sk;
        struct xdp_sock *xs = xdp_sk(sk);
 
+       if (unlikely(!xsk_is_bound(xs)))
+               return -ENXIO;
        if (unlikely(!(xs->dev->flags & IFF_UP)))
                return -ENETDOWN;
        if (unlikely(!xs->rx))
                return -ENOBUFS;
-       if (unlikely(!xsk_is_bound(xs)))
-               return -ENXIO;
        if (unlikely(need_wait))
                return -EOPNOTSUPP;