Commit 11ae737e authored by Amery Hung's avatar Amery Hung Committed by Jakub Kicinski
Browse files

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: efec2e55 ("selftests: drv-net: Pull data before parsing headers")
Signed-off-by: default avatarAmery Hung <ameryhung@gmail.com>
Acked-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
Link: https://patch.msgid.link/20250925161452.1290694-1-ameryhung@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent dd5629a6
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -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);