libbpf: fix signedness determination in CO-RE relo handling logic
authorAndrii Nakryiko <andrii@kernel.org>
Thu, 24 Aug 2023 00:00:16 +0000 (17:00 -0700)
committerMartin KaFai Lau <martin.lau@kernel.org>
Thu, 24 Aug 2023 04:13:48 +0000 (21:13 -0700)
Extracting btf_int_encoding() is only meaningful for BTF_KIND_INT, so we
need to check that first before inferring signedness.

Closes: https://github.com/libbpf/libbpf/issues/704
Reported-by: Lorenz Bauer <lmb@isovalent.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/r/20230824000016.2658017-2-andrii@kernel.org
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
tools/lib/bpf/relo_core.c

index a26b2f5fa0fc9b44bdc41509893cb3db11905260..63a4d5ad12d1a314ea8470e2f320dae313153d4c 100644 (file)
@@ -776,7 +776,7 @@ static int bpf_core_calc_field_relo(const char *prog_name,
                break;
        case BPF_CORE_FIELD_SIGNED:
                *val = (btf_is_any_enum(mt) && BTF_INFO_KFLAG(mt->info)) ||
-                      (btf_int_encoding(mt) & BTF_INT_SIGNED);
+                      (btf_is_int(mt) && (btf_int_encoding(mt) & BTF_INT_SIGNED));
                if (validate)
                        *validate = true; /* signedness is never ambiguous */
                break;