mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
selftests: drv-net: Reload pkt pointer after calling filter_udphdr
Fix a verification failure. filter_udphdr() calls bpf_xdp_pull_data(),
which will invalidate all pkt pointers. Therefore, all ctx->data loaded
before filter_udphdr() cannot be used. Reload it to prevent verification
errors.
The error may not appear on some compiler versions if they decide to
load ctx->data after filter_udphdr() when it is first used.
Fixes: efec2e55bd ("selftests: drv-net: Pull data before parsing headers")
Signed-off-by: Amery Hung <ameryhung@gmail.com>
Acked-by: Martin KaFai Lau <martin.lau@kernel.org>
Link: https://patch.msgid.link/20250925161452.1290694-1-ameryhung@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
dd5629a67c
commit
11ae737efe
@@ -420,7 +420,6 @@ static int xdp_adjst_tail_grow_data(struct xdp_md *ctx, __u16 offset)
|
||||
|
||||
static int xdp_adjst_tail(struct xdp_md *ctx, __u16 port)
|
||||
{
|
||||
void *data = (void *)(long)ctx->data;
|
||||
struct udphdr *udph = NULL;
|
||||
__s32 *adjust_offset, *val;
|
||||
__u32 key, hdr_len;
|
||||
@@ -432,7 +431,8 @@ static int xdp_adjst_tail(struct xdp_md *ctx, __u16 port)
|
||||
if (!udph)
|
||||
return XDP_PASS;
|
||||
|
||||
hdr_len = (void *)udph - data + sizeof(struct udphdr);
|
||||
hdr_len = (void *)udph - (void *)(long)ctx->data +
|
||||
sizeof(struct udphdr);
|
||||
key = XDP_ADJST_OFFSET;
|
||||
adjust_offset = bpf_map_lookup_elem(&map_xdp_setup, &key);
|
||||
if (!adjust_offset)
|
||||
@@ -572,8 +572,6 @@ static int xdp_adjst_head_grow_data(struct xdp_md *ctx, __u64 hdr_len,
|
||||
|
||||
static int xdp_head_adjst(struct xdp_md *ctx, __u16 port)
|
||||
{
|
||||
void *data_end = (void *)(long)ctx->data_end;
|
||||
void *data = (void *)(long)ctx->data;
|
||||
struct udphdr *udph_ptr = NULL;
|
||||
__u32 key, size, hdr_len;
|
||||
__s32 *val;
|
||||
@@ -584,7 +582,8 @@ static int xdp_head_adjst(struct xdp_md *ctx, __u16 port)
|
||||
if (!udph_ptr)
|
||||
return XDP_PASS;
|
||||
|
||||
hdr_len = (void *)udph_ptr - data + sizeof(struct udphdr);
|
||||
hdr_len = (void *)udph_ptr - (void *)(long)ctx->data +
|
||||
sizeof(struct udphdr);
|
||||
|
||||
key = XDP_ADJST_OFFSET;
|
||||
val = bpf_map_lookup_elem(&map_xdp_setup, &key);
|
||||
|
||||
Reference in New Issue
Block a user