]> www.infradead.org Git - users/hch/misc.git/commitdiff
selftests: drv-net: Reload pkt pointer after calling filter_udphdr
authorAmery Hung <ameryhung@gmail.com>
Thu, 25 Sep 2025 16:14:52 +0000 (09:14 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 26 Sep 2025 20:54:46 +0000 (13:54 -0700)
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: efec2e55bdef ("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>
tools/testing/selftests/net/lib/xdp_native.bpf.c

index df4eea5c192b3b45339ca0435193e3be0c5c38b2..c368fc045f4b4dce466271eadf511ca11ee156d9 100644 (file)
@@ -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);