On Thu, Jun 4, 2026 at 8:45 AM <[email protected]> wrote:
>
> > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> > index 625a4366fe6d..1007fb7c87e9 100644
> > --- a/kernel/bpf/syscall.c
> > +++ b/kernel/bpf/syscall.c
> > @@ -5400,10 +5400,11 @@ static int bpf_map_get_info_by_fd(struct file *file,
> >  {
> >       struct bpf_map_info __user *uinfo = u64_to_user_ptr(attr->info.info);
> >       struct bpf_map_info info;
> > -     u32 info_len = attr->info.info_len;
> > +     u32 info_len = attr->info.info_len, len;
> >       int err;
> >
> > -     err = bpf_check_uarg_tail_zero(USER_BPFPTR(uinfo), sizeof(info), 
> > info_len);
> > +     len = offsetofend(struct bpf_map_info, hash_size);
> > +     err = bpf_check_uarg_tail_zero(USER_BPFPTR(uinfo), len, info_len);
>
> Does this change break the ABI for existing deployed binaries? Previously,
> expected_size was 104 (sizeof(info)). If an existing binary passes info_len
> = 104 with uninitialized stack garbage in the 4-byte padding,
> bpf_check_uarg_tail_zero() would see actual_size <= expected_size (104 <=
> 104) and immediately return 0.
>
> By reducing expected_size to 100, actual_size > expected_size (104 > 100),
> so bpf_check_uarg_tail_zero() will actively check the 4 padding bytes and
> return -E2BIG if they contain garbage. This rejects previously working
> applications.
>
> Additionally, does this actually protect against the stated future issue?
> If a future kernel adds a new 4-byte field, the struct size stays 104, and
> the new kernel's expected_size will be 104. At that point, those old buggy
> binaries passing info_len = 104 will once again hit the fast path
> (actual_size <= expected_size), skipping the check and allowing the
> uninitialized padding to be consumed as the new field.

bot's concerns are valid.
Let's add __u32 :32 to bpf_map_info at the same time.

pw-bot: cr

Reply via email to