bpftool: Remove BPF_OBJ_NAME_LEN restriction when looking up bpf program by name
authorManu Bretelle <chantr4@gmail.com>
Mon, 1 Aug 2022 13:24:09 +0000 (06:24 -0700)
committerAndrii Nakryiko <andrii@kernel.org>
Thu, 4 Aug 2022 21:41:13 +0000 (14:41 -0700)
bpftool was limiting the length of names to BPF_OBJ_NAME_LEN in prog_parse
fds.

Since commit b662000aff84 ("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: Manu Bretelle <chantr4@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Tested-by: Jiri Olsa <jolsa@kernel.org>
Reviewed-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/bpf/20220801132409.4147849-1-chantr4@gmail.com
tools/bpf/bpftool/common.c

index 067e9ea..8727765 100644 (file)
@@ -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)
 {
+       char prog_name[MAX_PROG_FULL_NAME];
        unsigned int id = 0;
        int fd, nb_fds = 0;
        void *tmp;
@@ -754,12 +755,20 @@ static int prog_fd_by_nametag(void *nametag, int **fds, bool tag)
                        goto err_close_fd;
                }
 
-               if ((tag && memcmp(nametag, info.tag, BPF_TAG_SIZE)) ||
-                   (!tag && strncmp(nametag, info.name, BPF_OBJ_NAME_LEN))) {
+               if (tag && memcmp(nametag, info.tag, BPF_TAG_SIZE)) {
                        close(fd);
                        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) {
                        tmp = realloc(*fds, (nb_fds + 1) * sizeof(int));
                        if (!tmp) {
@@ -820,7 +829,7 @@ int prog_parse_fds(int *argc, char ***argv, int **fds)
                NEXT_ARGP();
 
                name = **argv;
-               if (strlen(name) > BPF_OBJ_NAME_LEN - 1) {
+               if (strlen(name) > MAX_PROG_FULL_NAME - 1) {
                        p_err("can't parse name");
                        return -1;
                }