libbpf: Fix an unsigned < 0 bug
authorYonghong Song <yhs@fb.com>
Mon, 13 Jun 2022 05:43:14 +0000 (22:43 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 14 Jun 2022 15:01:54 +0000 (17:01 +0200)
Andrii reported a bug with the following information:

  2859  if (enum64_placeholder_id == 0) {
  2860  enum64_placeholder_id = btf__add_int(btf, "enum64_placeholder", 1, 0);
  >>>     CID 394804:  Control flow issues  (NO_EFFECT)
  >>>     This less-than-zero comparison of an unsigned value is never true. "enum64_placeholder_id < 0U".
  2861  if (enum64_placeholder_id < 0)
  2862  return enum64_placeholder_id;
  2863     ...

Here enum64_placeholder_id declared as '__u32' so enum64_placeholder_id < 0
is always false. Declare enum64_placeholder_id as 'int' in order to capture
the potential error properly.

Fixes: f2a625889bb8 ("libbpf: Add enum64 sanitization")
Reported-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20220613054314.1251905-1-yhs@fb.com
tools/lib/bpf/libbpf.c

index 0781fae..d989b0a 100644 (file)
@@ -2786,7 +2786,7 @@ static int bpf_object__sanitize_btf(struct bpf_object *obj, struct btf *btf)
        bool has_decl_tag = kernel_supports(obj, FEAT_BTF_DECL_TAG);
        bool has_type_tag = kernel_supports(obj, FEAT_BTF_TYPE_TAG);
        bool has_enum64 = kernel_supports(obj, FEAT_BTF_ENUM64);
-       __u32 enum64_placeholder_id = 0;
+       int enum64_placeholder_id = 0;
        struct btf_type *t;
        int i, j, vlen;