summaryrefslogtreecommitdiff
path: root/tools/bpf/bpftool/jit_disasm.c
diff options
context:
space:
mode:
authorQuentin Monnet <quentin@isovalent.com>2022-10-25 18:03:23 +0300
committerAlexei Starovoitov <ast@kernel.org>2022-10-25 20:11:56 +0300
commit55b4de58d0e2aca810ed2b198a0173640300acf8 (patch)
tree76d2e01501176524959dc3dd1aaad71ea7fd79bd /tools/bpf/bpftool/jit_disasm.c
parentb3d84af7cdfc079ef86d94f7cf125821559925fa (diff)
downloadlinux-55b4de58d0e2aca810ed2b198a0173640300acf8.tar.xz
bpftool: Remove asserts from JIT disassembler
The JIT disassembler in bpftool is the only components (with the JSON writer) using asserts to check the return values of functions. But it does not do so in a consistent way, and diasm_print_insn() returns no value, although sometimes the operation failed. Remove the asserts, and instead check the return values, print messages on errors, and propagate the error to the caller from prog.c. Remove the inclusion of assert.h from jit_disasm.c, and also from map.c where it is unused. Signed-off-by: Quentin Monnet <quentin@isovalent.com> Tested-by: Niklas Söderlund <niklas.soderlund@corigine.com> Acked-by: Song Liu <song@kernel.org> Link: https://lore.kernel.org/r/20221025150329.97371-3-quentin@isovalent.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'tools/bpf/bpftool/jit_disasm.c')
-rw-r--r--tools/bpf/bpftool/jit_disasm.c51
1 files changed, 35 insertions, 16 deletions
diff --git a/tools/bpf/bpftool/jit_disasm.c b/tools/bpf/bpftool/jit_disasm.c
index 71cb258ab0ee..723a9b799a0c 100644
--- a/tools/bpf/bpftool/jit_disasm.c
+++ b/tools/bpf/bpftool/jit_disasm.c
@@ -18,7 +18,6 @@
#include <stdarg.h>
#include <stdint.h>
#include <stdlib.h>
-#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <bfd.h>
@@ -31,14 +30,18 @@
#include "json_writer.h"
#include "main.h"
-static void get_exec_path(char *tpath, size_t size)
+static int get_exec_path(char *tpath, size_t size)
{
const char *path = "/proc/self/exe";
ssize_t len;
len = readlink(path, tpath, size - 1);
- assert(len > 0);
+ if (len <= 0)
+ return -1;
+
tpath[len] = 0;
+
+ return 0;
}
static int oper_count;
@@ -99,30 +102,39 @@ static int fprintf_json_styled(void *out,
return r;
}
-void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
- const char *arch, const char *disassembler_options,
- const struct btf *btf,
- const struct bpf_prog_linfo *prog_linfo,
- __u64 func_ksym, unsigned int func_idx,
- bool linum)
+int disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
+ const char *arch, const char *disassembler_options,
+ const struct btf *btf,
+ const struct bpf_prog_linfo *prog_linfo,
+ __u64 func_ksym, unsigned int func_idx,
+ bool linum)
{
const struct bpf_line_info *linfo = NULL;
disassembler_ftype disassemble;
+ int count, i, pc = 0, err = -1;
struct disassemble_info info;
unsigned int nr_skip = 0;
- int count, i, pc = 0;
char tpath[PATH_MAX];
bfd *bfdf;
if (!len)
- return;
+ return -1;
memset(tpath, 0, sizeof(tpath));
- get_exec_path(tpath, sizeof(tpath));
+ if (get_exec_path(tpath, sizeof(tpath))) {
+ p_err("failed to create disasembler (get_exec_path)");
+ return -1;
+ }
bfdf = bfd_openr(tpath, NULL);
- assert(bfdf);
- assert(bfd_check_format(bfdf, bfd_object));
+ if (!bfdf) {
+ p_err("failed to create disassembler (bfd_openr)");
+ return -1;
+ }
+ if (!bfd_check_format(bfdf, bfd_object)) {
+ p_err("failed to create disassembler (bfd_check_format)");
+ goto exit_close;
+ }
if (json_output)
init_disassemble_info_compat(&info, stdout,
@@ -141,7 +153,7 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
bfdf->arch_info = inf;
} else {
p_err("No libbfd support for %s", arch);
- return;
+ goto exit_close;
}
}
@@ -162,7 +174,10 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
#else
disassemble = disassembler(bfdf);
#endif
- assert(disassemble);
+ if (!disassemble) {
+ p_err("failed to create disassembler");
+ goto exit_close;
+ }
if (json_output)
jsonw_start_array(json_wtr);
@@ -226,7 +241,11 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
if (json_output)
jsonw_end_array(json_wtr);
+ err = 0;
+
+exit_close:
bfd_close(bfdf);
+ return err;
}
int disasm_init(void)