diff options
| author | Daniel Borkmann <daniel@iogearbox.net> | 2017-11-30 02:09:30 +0100 |
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2017-11-30 02:09:30 +0100 |
| commit | d775a418ac45fc2eb3eec1a4897e23e915eb4b3c (patch) | |
| tree | fa55e234acf1c6bf1d4d96ed2d24de86792178d8 /tools/bpf/bpftool/main.c | |
| parent | a39e17b2d842938e19997d2fdc0443fdd4cd8d10 (diff) | |
| parent | ad3cda064402b69148faf5f7cd1ac8c2eee52645 (diff) | |
Merge branch 'bpftool-misc-fixes'
Quentin Monnet says:
====================
First commit in this series fixes a crash that occurs when incorrect
arguments are passed to bpftool after the `--json` option. It comes from
the usage() function trying to use the JSON writer, although the latter
has not been created yet at that point.
Other patches add destruction of the writer in case the program exits in
usage(), fix error messages handling when an unrecognized option is
encountered, remove a spurious new-line character in an error message.
Last patches are related to the Makefiles. They fix the installation
directory prefix and .PHONY targets.
====================
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'tools/bpf/bpftool/main.c')
| -rw-r--r-- | tools/bpf/bpftool/main.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c index d6e4762170a4..d294bc8168be 100644 --- a/tools/bpf/bpftool/main.c +++ b/tools/bpf/bpftool/main.c @@ -58,11 +58,19 @@ bool show_pinned; struct pinned_obj_table prog_table; struct pinned_obj_table map_table; +static void __noreturn clean_and_exit(int i) +{ + if (json_output) + jsonw_destroy(&json_wtr); + + exit(i); +} + void usage(void) { last_do_help(last_argc - 1, last_argv + 1); - exit(-1); + clean_and_exit(-1); } static int do_help(int argc, char **argv) @@ -280,6 +288,7 @@ int main(int argc, char **argv) hash_init(prog_table.table); hash_init(map_table.table); + opterr = 0; while ((opt = getopt_long(argc, argv, "Vhpjf", options, NULL)) >= 0) { switch (opt) { @@ -291,13 +300,25 @@ int main(int argc, char **argv) pretty_output = true; /* fall through */ case 'j': - json_output = true; + if (!json_output) { + json_wtr = jsonw_new(stdout); + if (!json_wtr) { + p_err("failed to create JSON writer"); + return -1; + } + json_output = true; + } + jsonw_pretty(json_wtr, pretty_output); break; case 'f': show_pinned = true; break; default: - usage(); + p_err("unrecognized option '%s'", argv[optind - 1]); + if (json_output) + clean_and_exit(-1); + else + usage(); } } @@ -306,15 +327,6 @@ int main(int argc, char **argv) if (argc < 0) usage(); - if (json_output) { - json_wtr = jsonw_new(stdout); - if (!json_wtr) { - p_err("failed to create JSON writer"); - return -1; - } - jsonw_pretty(json_wtr, pretty_output); - } - bfd_init(); ret = cmd_select(cmds, argc, argv, do_help); |
