Thank you for your contribution! Sashiko AI review found 2 potential issue(s) 
to consider:
- [Medium] The `vlen` for BTF_KIND_LOC_PROTO is incorrectly cast to `__u16`, 
causing implicit truncation for large vlen values.
- [Medium] The `BTF_LOC_PARAM_SIGNED` flag is ignored when printing values for 
`BTF_KIND_LOC_PARAM`, causing negative signed values to be printed as unsigned.
--

commit 979370a25e9a748392e761a4d7cd6d5cda14a0ed
Author: Alan Maguire <[email protected]>

bpftool: Add ability to dump LOC_PARAM, LOC_PROTO and LOCSEC
    
This commit updates bpftool to support dumping the new BTF kinds
BTF_KIND_LOC_PARAM, BTF_KIND_LOC_PROTO, and BTF_KIND_LOCSEC. It adds raw and
JSON formatting support for these new types.

> diff --git a/tools/bpf/bpftool/btf.c b/tools/bpf/bpftool/btf.c
> index bca0a3982f09b..4d8991c99b484 100644
> --- a/tools/bpf/bpftool/btf.c
> +++ b/tools/bpf/bpftool/btf.c
[ ... ]
> @@ -415,6 +418,88 @@ static int dump_btf_type(const struct btf *btf, __u32 id,
[ ... ]
> +     case BTF_KIND_LOC_PARAM: {
> +             const struct btf_loc_param *p = btf_loc_param(t);
> +             __u32 *v = (__u32 *)(p + 1);
> +             __u32 i, vlen = btf_vlen(t);
[ ... ]
> +             for (i = 0; i < vlen; i++, v++) {
> +                     if (json_output) {
> +                             jsonw_start_object(w);
> +                             jsonw_uint_field(w, "value", *v);

[Severity: Medium]
Since the BTF_LOC_PARAM_SIGNED flag can be set in p->flags, will this
jsonw_uint_field() unconditionally format negative signed values as large
unsigned integers?

> +                             jsonw_end_object(w);
> +                     } else {
> +                             printf("\n\t value=%u", *v);

[Severity: Medium]
Similarly for the plain-text output, does this ignore the BTF_LOC_PARAM_SIGNED
flag and print signed negative values as large unsigned integers?

> +                     }
> +             }
> +             if (json_output)
> +                     jsonw_end_array(w);
> +             break;
> +     }
> +     case BTF_KIND_LOC_PROTO: {
> +             __u32 *params = btf_loc_proto_params(t);
> +             __u16 vlen = btf_vlen(t);

[Severity: Medium]
The vlen field in BTF types uses 24 bits. Does explicitly casting it to __u16
here silently drop the upper 8 bits?

For a BTF_KIND_LOC_PROTO type with a vlen greater than 65535, this could
truncate the output and display an incorrect number of parameters.

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=11

Reply via email to