Commit d55dfe58 authored by Manu Bretelle's avatar Manu Bretelle Committed by Andrii Nakryiko

bpftool: Remove BPF_OBJ_NAME_LEN restriction when looking up bpf program by name

bpftool was limiting the length of names to BPF_OBJ_NAME_LEN in prog_parse
fds.

Since commit b662000a ("bpftool: Adding support for BTF program names")
we can get the full program name from BTF.

This patch removes the restriction of name length when running `bpftool
prog show name ${name}`.

Test:
Tested against some internal program names that were longer than
`BPF_OBJ_NAME_LEN`, here a redacted example of what was ran to test.

    # previous behaviour
    $ sudo bpftool prog show name some_long_program_name
    Error: can't parse name
    # with the patch
    $ sudo ./bpftool prog show name some_long_program_name
    123456789: tracing  name some_long_program_name  tag taghexa  gpl ....
    ...
    ...
    ...
    # too long
    sudo ./bpftool prog show name $(python3 -c 'print("A"*128)')
    Error: can't parse name
    # not too long but no match
    $ sudo ./bpftool prog show name $(python3 -c 'print("A"*127)')
Signed-off-by: default avatarManu Bretelle <chantr4@gmail.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Tested-by: default avatarJiri Olsa <jolsa@kernel.org>
Reviewed-by: default avatarQuentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/bpf/20220801132409.4147849-1-chantr4@gmail.com
parent 3045f42a
...@@ -722,6 +722,7 @@ print_all_levels(__maybe_unused enum libbpf_print_level level, ...@@ -722,6 +722,7 @@ print_all_levels(__maybe_unused enum libbpf_print_level level,
static int prog_fd_by_nametag(void *nametag, int **fds, bool tag) static int prog_fd_by_nametag(void *nametag, int **fds, bool tag)
{ {
char prog_name[MAX_PROG_FULL_NAME];
unsigned int id = 0; unsigned int id = 0;
int fd, nb_fds = 0; int fd, nb_fds = 0;
void *tmp; void *tmp;
...@@ -754,12 +755,20 @@ static int prog_fd_by_nametag(void *nametag, int **fds, bool tag) ...@@ -754,12 +755,20 @@ static int prog_fd_by_nametag(void *nametag, int **fds, bool tag)
goto err_close_fd; goto err_close_fd;
} }
if ((tag && memcmp(nametag, info.tag, BPF_TAG_SIZE)) || if (tag && memcmp(nametag, info.tag, BPF_TAG_SIZE)) {
(!tag && strncmp(nametag, info.name, BPF_OBJ_NAME_LEN))) {
close(fd); close(fd);
continue; continue;
} }
if (!tag) {
get_prog_full_name(&info, fd, prog_name,
sizeof(prog_name));
if (strncmp(nametag, prog_name, sizeof(prog_name))) {
close(fd);
continue;
}
}
if (nb_fds > 0) { if (nb_fds > 0) {
tmp = realloc(*fds, (nb_fds + 1) * sizeof(int)); tmp = realloc(*fds, (nb_fds + 1) * sizeof(int));
if (!tmp) { if (!tmp) {
...@@ -820,7 +829,7 @@ int prog_parse_fds(int *argc, char ***argv, int **fds) ...@@ -820,7 +829,7 @@ int prog_parse_fds(int *argc, char ***argv, int **fds)
NEXT_ARGP(); NEXT_ARGP();
name = **argv; name = **argv;
if (strlen(name) > BPF_OBJ_NAME_LEN - 1) { if (strlen(name) > MAX_PROG_FULL_NAME - 1) {
p_err("can't parse name"); p_err("can't parse name");
return -1; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment