[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210427121903.76556-1-xuanzhuo@linux.alibaba.com>
Date: Tue, 27 Apr 2021 20:19:03 +0800
From: Xuan Zhuo <xuanzhuo@...ux.alibaba.com>
To: bpf@...r.kernel.org
Cc: Björn Töpel <bjorn@...nel.org>,
Magnus Karlsson <magnus.karlsson@...el.com>,
Jonathan Lemon <jonathan.lemon@...il.com>,
"David S. Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Alexei Starovoitov <ast@...nel.org>,
Daniel Borkmann <daniel@...earbox.net>,
Jesper Dangaard Brouer <hawk@...nel.org>,
John Fastabend <john.fastabend@...il.com>,
Andrii Nakryiko <andrii@...nel.org>,
Martin KaFai Lau <kafai@...com>,
Song Liu <songliubraving@...com>, Yonghong Song <yhs@...com>,
KP Singh <kpsingh@...nel.org>,
Maxim Mikityanskiy <maximmi@...lanox.com>,
netdev@...r.kernel.org
Subject: [PATCH bpf] xsk: fix for xp_aligned_validate_desc() when len == chunk_size
When desc->len is equal to chunk_size, it is legal. But
xp_aligned_validate_desc() got "chunk_end" by desc->addr + desc->len
pointing to the next chunk during the check, which caused the check to
fail.
Fixes: 35fcde7f8deb ("xsk: support for Tx")
Fixes: bbff2f321a86 ("xsk: new descriptor addressing scheme")
Fixes: 2b43470add8c ("xsk: Introduce AF_XDP buffer allocation API")
Fixes: 26062b185eee ("xsk: Explicitly inline functions and move definitions")
Signed-off-by: Xuan Zhuo <xuanzhuo@...ux.alibaba.com>
---
net/xdp/xsk_queue.h | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h
index 2823b7c3302d..40f359bf2044 100644
--- a/net/xdp/xsk_queue.h
+++ b/net/xdp/xsk_queue.h
@@ -128,13 +128,12 @@ static inline bool xskq_cons_read_addr_unchecked(struct xsk_queue *q, u64 *addr)
static inline bool xp_aligned_validate_desc(struct xsk_buff_pool *pool,
struct xdp_desc *desc)
{
- u64 chunk, chunk_end;
+ u64 chunk;
- chunk = xp_aligned_extract_addr(pool, desc->addr);
- chunk_end = xp_aligned_extract_addr(pool, desc->addr + desc->len);
- if (chunk != chunk_end)
+ if (desc->len > pool->chunk_size)
return false;
+ chunk = xp_aligned_extract_addr(pool, desc->addr);
if (chunk >= pool->addrs_cnt)
return false;
--
2.31.0
Powered by blists - more mailing lists