xsk: Fix unaligned descriptor validation
[ Upstream commitd769ccaf95
] Make sure unaligned descriptors that straddle the end of the UMEM are considered invalid. Currently, descriptor validation is broken for zero-copy mode which only checks descriptors at page granularity. For example, descriptors in zero-copy mode that overrun the end of the UMEM but not a page boundary are (incorrectly) considered valid. The UMEM boundary check needs to happen before the page boundary and contiguity checks in xp_desc_crosses_non_contig_pg(). Do this check in xp_unaligned_validate_desc() instead like xp_check_unaligned() already does. Fixes:2b43470add
("xsk: Introduce AF_XDP buffer allocation API") Signed-off-by: Kal Conley <kal.conley@dectris.com> Acked-by: Magnus Karlsson <magnus.karlsson@intel.com> Link: https://lore.kernel.org/r/20230405235920.7305-2-kal.conley@dectris.com Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
8bc8e34e80
commit
3ee343914c
|
@ -175,13 +175,8 @@ static inline bool xp_desc_crosses_non_contig_pg(struct xsk_buff_pool *pool,
|
|||
if (likely(!cross_pg))
|
||||
return false;
|
||||
|
||||
if (pool->dma_pages_cnt) {
|
||||
return !(pool->dma_pages[addr >> PAGE_SHIFT] &
|
||||
XSK_NEXT_PG_CONTIG_MASK);
|
||||
}
|
||||
|
||||
/* skb path */
|
||||
return addr + len > pool->addrs_cnt;
|
||||
return pool->dma_pages_cnt &&
|
||||
!(pool->dma_pages[addr >> PAGE_SHIFT] & XSK_NEXT_PG_CONTIG_MASK);
|
||||
}
|
||||
|
||||
static inline u64 xp_aligned_extract_addr(struct xsk_buff_pool *pool, u64 addr)
|
||||
|
|
|
@ -161,6 +161,7 @@ static inline bool xp_unaligned_validate_desc(struct xsk_buff_pool *pool,
|
|||
return false;
|
||||
|
||||
if (base_addr >= pool->addrs_cnt || addr >= pool->addrs_cnt ||
|
||||
addr + desc->len > pool->addrs_cnt ||
|
||||
xp_desc_crosses_non_contig_pg(pool, addr, desc->len))
|
||||
return false;
|
||||
|
||||
|
|
Loading…
Reference in New Issue