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 b662000aff
("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
This commit is contained in:
Родитель
3045f42a64
Коммит
d55dfe587b
|
@ -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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче