Re: [PATCH bpf-next 1/2] bpf: don't infer PTR_TO_CTX for programs with unnamed context type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Feb 9, 2024 at 3:09 PM Andrii Nakryiko <andrii@xxxxxxxxxx> wrote:
>
> For program types that don't have named context type name (e.g., BPF
> iterator programs or tracepoint programs), ctx_tname will be a non-NULL
> empty string. For such programs it shouldn't be possible to have
> PTR_TO_CTX argument for global subprogs based on type name alone.
> arg:ctx tag is the only way to have PTR_TO_CTX passed into global
> subprog for such program types.
>
> Fix this loop hole, which currently would assume PTR_TO_CTX whenever
> user uses a pointer to anonymous struct as an argument to their global
> subprogs. This happens in practice with the following (quite common, in
> practice) approach:
>
> typedef struct { /* anonymous */
>     int x;
> } my_type_t;
>
> int my_subprog(my_type_t *arg) { ... }
>
> User's intent is to have PTR_TO_MEM argument for `arg`, but verifier
> will complain about expecting PTR_TO_CTX.
>
> Fixes: 91cc1a99740e ("bpf: Annotate context types")
> Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx>
> ---
>  kernel/bpf/btf.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
> index 8e06d29961f1..d6021290caba 100644
> --- a/kernel/bpf/btf.c
> +++ b/kernel/bpf/btf.c
> @@ -5725,6 +5725,9 @@ btf_get_prog_ctx_type(struct bpf_verifier_log *log, const struct btf *btf,
>                 bpf_log(log, "Please fix kernel include/linux/bpf_types.h\n");
>                 return NULL;
>         }
> +       /* program types without named context types work only with arg:ctx tag */
> +       if (ctx_tname[0] == '\0')
> +               return NULL;

this break s390 because there `bpf_user_pt_regs_t *ctx` was supported
not based on `bpf_user_pt_regs_t` name, but because bpf_user_pt_regs_t
is actually a typedef to anonymous struct... (i.e., by accident). I'll
think about how to fix s390 and will post v2 next week.

>         /* only compare that prog's ctx type name is the same as
>          * kernel expects. No need to compare field by field.
>          * It's ok for bpf prog to do:
> --
> 2.39.3
>





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux