Skip to content
Snippets Groups Projects
Commit 53ea2076 authored by Magnus Karlsson's avatar Magnus Karlsson Committed by Daniel Borkmann
Browse files

xsk: Fix possible segfault in xsk umem diagnostics


Fix possible segfault in the xsk diagnostics code when dumping
information about the umem. This can happen when a umem has been
created, but the socket has not been bound yet. In this case, the xsk
buffer pool does not exist yet and we cannot dump the information
that was moved from the umem to the buffer pool. Fix this by testing
for the existence of the buffer pool and if not there, do not dump any
of that information.

Fixes: c2d3d6a4 ("xsk: Move queue_id, dev and need_wakeup to buffer pool")
Fixes: 7361f9c3 ("xsk: Move fill and completion rings to buffer pool")
Reported-by: default avatar <syzbot+3f04d36b7336f7868066@syzkaller.appspotmail.com>
Signed-off-by: default avatarMagnus Karlsson <magnus.karlsson@intel.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/1599036743-26454-1-git-send-email-magnus.karlsson@intel.com
parent 858e8b2e
No related branches found
No related tags found
No related merge requests found
...@@ -59,22 +59,20 @@ static int xsk_diag_put_umem(const struct xdp_sock *xs, struct sk_buff *nlskb) ...@@ -59,22 +59,20 @@ static int xsk_diag_put_umem(const struct xdp_sock *xs, struct sk_buff *nlskb)
du.num_pages = umem->npgs; du.num_pages = umem->npgs;
du.chunk_size = umem->chunk_size; du.chunk_size = umem->chunk_size;
du.headroom = umem->headroom; du.headroom = umem->headroom;
du.ifindex = pool->netdev ? pool->netdev->ifindex : 0; du.ifindex = (pool && pool->netdev) ? pool->netdev->ifindex : 0;
du.queue_id = pool->queue_id; du.queue_id = pool ? pool->queue_id : 0;
du.flags = 0; du.flags = 0;
if (umem->zc) if (umem->zc)
du.flags |= XDP_DU_F_ZEROCOPY; du.flags |= XDP_DU_F_ZEROCOPY;
du.refs = refcount_read(&umem->users); du.refs = refcount_read(&umem->users);
err = nla_put(nlskb, XDP_DIAG_UMEM, sizeof(du), &du); err = nla_put(nlskb, XDP_DIAG_UMEM, sizeof(du), &du);
if (!err && pool && pool->fq)
if (!err && pool->fq)
err = xsk_diag_put_ring(pool->fq, err = xsk_diag_put_ring(pool->fq,
XDP_DIAG_UMEM_FILL_RING, nlskb); XDP_DIAG_UMEM_FILL_RING, nlskb);
if (!err && pool->cq) { if (!err && pool && pool->cq)
err = xsk_diag_put_ring(pool->cq, XDP_DIAG_UMEM_COMPLETION_RING, err = xsk_diag_put_ring(pool->cq,
nlskb); XDP_DIAG_UMEM_COMPLETION_RING, nlskb);
}
return err; return err;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment