Skip to content

Commit e504389

Browse files
chenhengqianakryiko
authored andcommitted
bpftool: Use libbpf_get_error() to check error
Currently, LIBBPF_STRICT_ALL mode is enabled by default for bpftool which means on error cases, some libbpf APIs would return NULL pointers. This makes IS_ERR check failed to detect such cases and result in segfault error. Use libbpf_get_error() instead like we do in libbpf itself. Signed-off-by: Hengqi Chen <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent c874dff commit e504389

File tree

5 files changed

+27
-23
lines changed

5 files changed

+27
-23
lines changed

tools/bpf/bpftool/btf.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,9 @@ static int dump_btf_c(const struct btf *btf,
421421
int err = 0, i;
422422

423423
d = btf_dump__new(btf, btf_dump_printf, NULL, NULL);
424-
if (IS_ERR(d))
425-
return PTR_ERR(d);
424+
err = libbpf_get_error(d);
425+
if (err)
426+
return err;
426427

427428
printf("#ifndef __VMLINUX_H__\n");
428429
printf("#define __VMLINUX_H__\n");
@@ -549,8 +550,8 @@ static int do_dump(int argc, char **argv)
549550
}
550551

551552
btf = btf__parse_split(*argv, base ?: base_btf);
552-
if (IS_ERR(btf)) {
553-
err = -PTR_ERR(btf);
553+
err = libbpf_get_error(btf);
554+
if (err) {
554555
btf = NULL;
555556
p_err("failed to load BTF from %s: %s",
556557
*argv, strerror(err));

tools/bpf/bpftool/gen.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,9 @@ static int codegen_datasecs(struct bpf_object *obj, const char *obj_name)
219219
int i, err = 0;
220220

221221
d = btf_dump__new(btf, codegen_btf_dump_printf, NULL, NULL);
222-
if (IS_ERR(d))
223-
return PTR_ERR(d);
222+
err = libbpf_get_error(d);
223+
if (err)
224+
return err;
224225

225226
bpf_object__for_each_map(map, obj) {
226227
/* only generate definitions for memory-mapped internal maps */
@@ -719,10 +720,11 @@ static int do_skeleton(int argc, char **argv)
719720
get_obj_name(obj_name, file);
720721
opts.object_name = obj_name;
721722
obj = bpf_object__open_mem(obj_data, file_sz, &opts);
722-
if (IS_ERR(obj)) {
723+
err = libbpf_get_error(obj);
724+
if (err) {
723725
char err_buf[256];
724726

725-
libbpf_strerror(PTR_ERR(obj), err_buf, sizeof(err_buf));
727+
libbpf_strerror(err, err_buf, sizeof(err_buf));
726728
p_err("failed to open BPF object file: %s", err_buf);
727729
obj = NULL;
728730
goto out;

tools/bpf/bpftool/iter.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ static int do_pin(int argc, char **argv)
4646
}
4747

4848
obj = bpf_object__open(objfile);
49-
if (IS_ERR(obj)) {
49+
err = libbpf_get_error(obj);
50+
if (err) {
5051
p_err("can't open objfile %s", objfile);
5152
goto close_map_fd;
5253
}
@@ -64,8 +65,8 @@ static int do_pin(int argc, char **argv)
6465
}
6566

6667
link = bpf_program__attach_iter(prog, &iter_opts);
67-
if (IS_ERR(link)) {
68-
err = PTR_ERR(link);
68+
err = libbpf_get_error(link);
69+
if (err) {
6970
p_err("attach_iter failed for program %s",
7071
bpf_program__name(prog));
7172
goto close_obj;

tools/bpf/bpftool/map.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,7 @@ static struct btf *get_map_kv_btf(const struct bpf_map_info *info)
812812
if (info->btf_vmlinux_value_type_id) {
813813
if (!btf_vmlinux) {
814814
btf_vmlinux = libbpf_find_kernel_btf();
815-
if (IS_ERR(btf_vmlinux))
815+
if (libbpf_get_error(btf_vmlinux))
816816
p_err("failed to get kernel btf");
817817
}
818818
return btf_vmlinux;
@@ -832,13 +832,13 @@ static struct btf *get_map_kv_btf(const struct bpf_map_info *info)
832832

833833
static void free_map_kv_btf(struct btf *btf)
834834
{
835-
if (!IS_ERR(btf) && btf != btf_vmlinux)
835+
if (!libbpf_get_error(btf) && btf != btf_vmlinux)
836836
btf__free(btf);
837837
}
838838

839839
static void free_btf_vmlinux(void)
840840
{
841-
if (!IS_ERR(btf_vmlinux))
841+
if (!libbpf_get_error(btf_vmlinux))
842842
btf__free(btf_vmlinux);
843843
}
844844

@@ -863,8 +863,8 @@ map_dump(int fd, struct bpf_map_info *info, json_writer_t *wtr,
863863

864864
if (wtr) {
865865
btf = get_map_kv_btf(info);
866-
if (IS_ERR(btf)) {
867-
err = PTR_ERR(btf);
866+
err = libbpf_get_error(btf);
867+
if (err) {
868868
goto exit_free;
869869
}
870870

tools/bpf/bpftool/struct_ops.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static const struct btf *get_btf_vmlinux(void)
3232
return btf_vmlinux;
3333

3434
btf_vmlinux = libbpf_find_kernel_btf();
35-
if (IS_ERR(btf_vmlinux))
35+
if (libbpf_get_error(btf_vmlinux))
3636
p_err("struct_ops requires kernel CONFIG_DEBUG_INFO_BTF=y");
3737

3838
return btf_vmlinux;
@@ -45,7 +45,7 @@ static const char *get_kern_struct_ops_name(const struct bpf_map_info *info)
4545
const char *st_ops_name;
4646

4747
kern_btf = get_btf_vmlinux();
48-
if (IS_ERR(kern_btf))
48+
if (libbpf_get_error(kern_btf))
4949
return "<btf_vmlinux_not_found>";
5050

5151
t = btf__type_by_id(kern_btf, info->btf_vmlinux_value_type_id);
@@ -63,7 +63,7 @@ static __s32 get_map_info_type_id(void)
6363
return map_info_type_id;
6464

6565
kern_btf = get_btf_vmlinux();
66-
if (IS_ERR(kern_btf)) {
66+
if (libbpf_get_error(kern_btf)) {
6767
map_info_type_id = PTR_ERR(kern_btf);
6868
return map_info_type_id;
6969
}
@@ -415,7 +415,7 @@ static int do_dump(int argc, char **argv)
415415
}
416416

417417
kern_btf = get_btf_vmlinux();
418-
if (IS_ERR(kern_btf))
418+
if (libbpf_get_error(kern_btf))
419419
return -1;
420420

421421
if (!json_output) {
@@ -495,7 +495,7 @@ static int do_register(int argc, char **argv)
495495
file = GET_ARG();
496496

497497
obj = bpf_object__open(file);
498-
if (IS_ERR_OR_NULL(obj))
498+
if (libbpf_get_error(obj))
499499
return -1;
500500

501501
set_max_rlimit();
@@ -516,7 +516,7 @@ static int do_register(int argc, char **argv)
516516
continue;
517517

518518
link = bpf_map__attach_struct_ops(map);
519-
if (IS_ERR(link)) {
519+
if (libbpf_get_error(link)) {
520520
p_err("can't register struct_ops %s: %s",
521521
bpf_map__name(map),
522522
strerror(-PTR_ERR(link)));
@@ -596,7 +596,7 @@ int do_struct_ops(int argc, char **argv)
596596

597597
err = cmd_select(cmds, argc, argv, do_help);
598598

599-
if (!IS_ERR(btf_vmlinux))
599+
if (!libbpf_get_error(btf_vmlinux))
600600
btf__free(btf_vmlinux);
601601

602602
return err;

0 commit comments

Comments
 (0)