Skip to content

Commit 63b39f5

Browse files
kknjhsmb49
authored andcommitted
libbpf: Fix event name too long error
BugLink: https://bugs.launchpad.net/bugs/2119603 [ Upstream commit 4dde20b1aa85d69c4281eaac9a7cfa7d2b62ecf0 ] When the binary path is excessively long, the generated probe_name in libbpf exceeds the kernel's MAX_EVENT_NAME_LEN limit (64 bytes). This causes legacy uprobe event attachment to fail with error code -22. The fix reorders the fields to place the unique ID before the name. This ensures that even if truncation occurs via snprintf, the unique ID remains intact, preserving event name uniqueness. Additionally, explicit checks with MAX_EVENT_NAME_LEN are added to enforce length constraints. Before Fix: ./test_progs -t attach_probe/kprobe-long_name ...... libbpf: failed to add legacy kprobe event for 'bpf_testmod_looooooooooooooooooooooooooooooong_name+0x0': -EINVAL libbpf: prog 'handle_kprobe': failed to create kprobe 'bpf_testmod_looooooooooooooooooooooooooooooong_name+0x0' perf event: -EINVAL test_attach_kprobe_long_event_name:FAIL:attach_kprobe_long_event_name unexpected error: -22 test_attach_probe:PASS:uprobe_ref_ctr_cleanup 0 nsec #13/11 attach_probe/kprobe-long_name:FAIL #13 attach_probe:FAIL ./test_progs -t attach_probe/uprobe-long_name ...... libbpf: failed to add legacy uprobe event for /root/linux-bpf/bpf-next/tools/testing/selftests/bpf/test_progs:0x13efd9: -EINVAL libbpf: prog 'handle_uprobe': failed to create uprobe '/root/linux-bpf/bpf-next/tools/testing/selftests/bpf/test_progs:0x13efd9' perf event: -EINVAL test_attach_uprobe_long_event_name:FAIL:attach_uprobe_long_event_name unexpected error: -22 #13/10 attach_probe/uprobe-long_name:FAIL #13 attach_probe:FAIL After Fix: ./test_progs -t attach_probe/uprobe-long_name #13/10 attach_probe/uprobe-long_name:OK #13 attach_probe:OK Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED ./test_progs -t attach_probe/kprobe-long_name #13/11 attach_probe/kprobe-long_name:OK #13 attach_probe:OK Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED Fixes: 46ed5fc ("libbpf: Refactor and simplify legacy kprobe code") Fixes: cc10623 ("libbpf: Add legacy uprobe attaching support") Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com> Signed-off-by: Feng Yang <yangfeng@kylinos.cn> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20250417014848.59321-2-yangfeng59949@163.com Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Manuel Diewald <manuel.diewald@canonical.com> Signed-off-by: Mehmet Basaran <mehmet.basaran@canonical.com>
1 parent f17f20e commit 63b39f5

File tree

1 file changed

+16
-27
lines changed

1 file changed

+16
-27
lines changed

tools/lib/bpf/libbpf.c

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@
6060
#define BPF_FS_MAGIC 0xcafe4a11
6161
#endif
6262

63+
#define MAX_EVENT_NAME_LEN 64
64+
6365
#define BPF_FS_DEFAULT_PATH "/sys/fs/bpf"
6466

6567
#define BPF_INSN_SZ (sizeof(struct bpf_insn))
@@ -11056,16 +11058,16 @@ static const char *tracefs_available_filter_functions_addrs(void)
1105611058
: TRACEFS"/available_filter_functions_addrs";
1105711059
}
1105811060

11059-
static void gen_kprobe_legacy_event_name(char *buf, size_t buf_sz,
11060-
const char *kfunc_name, size_t offset)
11061+
static void gen_probe_legacy_event_name(char *buf, size_t buf_sz,
11062+
const char *name, size_t offset)
1106111063
{
1106211064
static int index = 0;
1106311065
int i;
1106411066

11065-
snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx_%d", getpid(), kfunc_name, offset,
11066-
__sync_fetch_and_add(&index, 1));
11067+
snprintf(buf, buf_sz, "libbpf_%u_%d_%s_0x%zx", getpid(),
11068+
__sync_fetch_and_add(&index, 1), name, offset);
1106711069

11068-
/* sanitize binary_path in the probe name */
11070+
/* sanitize name in the probe name */
1106911071
for (i = 0; buf[i]; i++) {
1107011072
if (!isalnum(buf[i]))
1107111073
buf[i] = '_';
@@ -11190,9 +11192,9 @@ int probe_kern_syscall_wrapper(int token_fd)
1119011192

1119111193
return pfd >= 0 ? 1 : 0;
1119211194
} else { /* legacy mode */
11193-
char probe_name[128];
11195+
char probe_name[MAX_EVENT_NAME_LEN];
1119411196

11195-
gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0);
11197+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0);
1119611198
if (add_kprobe_event_legacy(probe_name, false, syscall_name, 0) < 0)
1119711199
return 0;
1119811200

@@ -11248,10 +11250,10 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog,
1124811250
func_name, offset,
1124911251
-1 /* pid */, 0 /* ref_ctr_off */);
1125011252
} else {
11251-
char probe_name[256];
11253+
char probe_name[MAX_EVENT_NAME_LEN];
1125211254

11253-
gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name),
11254-
func_name, offset);
11255+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name),
11256+
func_name, offset);
1125511257

1125611258
legacy_probe = strdup(probe_name);
1125711259
if (!legacy_probe)
@@ -11795,20 +11797,6 @@ static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, stru
1179511797
return ret;
1179611798
}
1179711799

11798-
static void gen_uprobe_legacy_event_name(char *buf, size_t buf_sz,
11799-
const char *binary_path, uint64_t offset)
11800-
{
11801-
int i;
11802-
11803-
snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx", getpid(), binary_path, (size_t)offset);
11804-
11805-
/* sanitize binary_path in the probe name */
11806-
for (i = 0; buf[i]; i++) {
11807-
if (!isalnum(buf[i]))
11808-
buf[i] = '_';
11809-
}
11810-
}
11811-
1181211800
static inline int add_uprobe_event_legacy(const char *probe_name, bool retprobe,
1181311801
const char *binary_path, size_t offset)
1181411802
{
@@ -12232,13 +12220,14 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid,
1223212220
pfd = perf_event_open_probe(true /* uprobe */, retprobe, binary_path,
1223312221
func_offset, pid, ref_ctr_off);
1223412222
} else {
12235-
char probe_name[PATH_MAX + 64];
12223+
char probe_name[MAX_EVENT_NAME_LEN];
1223612224

1223712225
if (ref_ctr_off)
1223812226
return libbpf_err_ptr(-EINVAL);
1223912227

12240-
gen_uprobe_legacy_event_name(probe_name, sizeof(probe_name),
12241-
binary_path, func_offset);
12228+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name),
12229+
strrchr(binary_path, '/') ? : binary_path,
12230+
func_offset);
1224212231

1224312232
legacy_probe = strdup(probe_name);
1224412233
if (!legacy_probe)

0 commit comments

Comments
 (0)