]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Test creating dynptr from dynptr data and slice
authorAmery Hung <ameryhung@gmail.com>
Fri, 29 May 2026 01:49:33 +0000 (18:49 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 2 Jun 2026 01:31:42 +0000 (18:31 -0700)
The verifier currently does not allow creating dynptr from dynptr data
or slice. Add a selftest to test this explicitly.

Signed-off-by: Amery Hung <ameryhung@gmail.com>
Link: https://lore.kernel.org/r/20260529014936.2811085-11-ameryhung@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/dynptr_fail.c

index 40a14a5174a53e83d75b3dfc606ff34bbf4ef10f..344fb2aa0813d9c98adab43bb90d780914b0d4d2 100644 (file)
@@ -705,6 +705,48 @@ int dynptr_from_mem_invalid_api(void *ctx)
        return 0;
 }
 
+/* Cannot create dynptr from dynptr data */
+SEC("?raw_tp")
+__failure __msg("Unsupported reg type mem for bpf_dynptr_from_mem data")
+int dynptr_from_dynptr_data(void *ctx)
+{
+       struct bpf_dynptr ptr, ptr2;
+       __u8 *data;
+
+       if (get_map_val_dynptr(&ptr))
+               return 0;
+
+       data = bpf_dynptr_data(&ptr, 0, sizeof(__u32));
+       if (!data)
+               return 0;
+
+       /* this should fail */
+       bpf_dynptr_from_mem(data, sizeof(__u32), 0, &ptr2);
+
+       return 0;
+}
+
+/* Cannot create dynptr from dynptr slice */
+SEC("?tc")
+__failure __msg("Unsupported reg type mem for bpf_dynptr_from_mem data")
+int dynptr_from_dynptr_slice(struct __sk_buff *skb)
+{
+       struct bpf_dynptr ptr, ptr2;
+       struct ethhdr *hdr;
+       char buffer[sizeof(*hdr)] = {};
+
+       bpf_dynptr_from_skb(skb, 0, &ptr);
+
+       hdr = bpf_dynptr_slice_rdwr(&ptr, 0, buffer, sizeof(buffer));
+       if (!hdr)
+               return SK_DROP;
+
+       /* this should fail */
+       bpf_dynptr_from_mem(hdr, sizeof(*hdr), 0, &ptr2);
+
+       return SK_PASS;
+}
+
 SEC("?tc")
 __failure __msg("cannot overwrite referenced dynptr") __log_level(2)
 int dynptr_pruning_overwrite(struct __sk_buff *ctx)