On Wed, 2026-07-22 at 05:27 +0000, Yiyang Chen wrote:
> Add verifier coverage for the three cases affected by preserving the full
> pointer state across scalar += pointer: stack frame number inheritance,
> readonly-untrusted memory access, and dynptr data-slice invalidation.
> 
> Signed-off-by: Yiyang Chen <[email protected]>
> ---

Acked-by: Eduard Zingerman <[email protected]>

>  .../testing/selftests/bpf/progs/dynptr_fail.c | 31 ++++++++++++++
>  .../bpf/progs/mem_rdonly_untrusted.c          | 17 ++++++++
>  .../bpf/progs/verifier_basic_stack.c          | 41 +++++++++++++++++++
>  3 files changed, 89 insertions(+)
> 
> diff --git a/tools/testing/selftests/bpf/progs/dynptr_fail.c 
> b/tools/testing/selftests/bpf/progs/dynptr_fail.c
> index 94489ac64da8e..7da4266bae09b 100644
> --- a/tools/testing/selftests/bpf/progs/dynptr_fail.c
> +++ b/tools/testing/selftests/bpf/progs/dynptr_fail.c
> @@ -1635,6 +1635,37 @@ static int callback(__u32 index, void *data)
>          return 0;
>  }
>  
> +/* A commuted add should preserve the parent id of a dynptr data slice.
> + */

Nit: comments style is:

  /* foo */

or

  /*
   * foo
   * bar
   */

> +SEC("?raw_tp")
> +__failure __msg("invalid mem access 'scalar'")
> +int dynptr_slice_commuted_invalidate(void *ctx)
> +{
> +     struct bpf_dynptr ptr;
> +     __u32 *slice, *derived;
> +
> +     bpf_ringbuf_reserve_dynptr(&ringbuf, sizeof(__u32), 0, &ptr);
> +
> +     slice = bpf_dynptr_data(&ptr, 0, sizeof(__u32));
> +     if (!slice)
> +             goto done;
> +
> +     asm volatile ("%[dst] = 0;"
> +             "%[dst] += %[src];"
> +             "%[src] = 0;"

Nit: no need to zero out 'src'?

> +             : [dst]"=&r"(derived), [src]"+r"(slice)
> +             :
> +             : "memory");
> +
> +     bpf_ringbuf_discard_dynptr(&ptr, 0);
> +     val = *derived;
> +     return 0;
> +
> +done:
> +     bpf_ringbuf_discard_dynptr(&ptr, 0);
> +     return 0;
> +}
> +

...

Reply via email to