Skip to content

Commit a15a38a

Browse files
kknjhKernel Patches Daemon
authored and
Kernel Patches Daemon
committed
libbpf: Fix event name too long error
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>
1 parent 93b2b34 commit a15a38a

File tree

1 file changed

+16
-27
lines changed

1 file changed

+16
-27
lines changed

tools/lib/bpf/libbpf.c

+16-27
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))
@@ -11136,16 +11138,16 @@ static const char *tracefs_available_filter_functions_addrs(void)
1113611138
: TRACEFS"/available_filter_functions_addrs";
1113711139
}
1113811140

11139-
static void gen_kprobe_legacy_event_name(char *buf, size_t buf_sz,
11140-
const char *kfunc_name, size_t offset)
11141+
static void gen_probe_legacy_event_name(char *buf, size_t buf_sz,
11142+
const char *name, size_t offset)
1114111143
{
1114211144
static int index = 0;
1114311145
int i;
1114411146

11145-
snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx_%d", getpid(), kfunc_name, offset,
11146-
__sync_fetch_and_add(&index, 1));
11147+
snprintf(buf, buf_sz, "libbpf_%u_%d_%s_0x%zx", getpid(),
11148+
__sync_fetch_and_add(&index, 1), name, offset);
1114711149

11148-
/* sanitize binary_path in the probe name */
11150+
/* sanitize name in the probe name */
1114911151
for (i = 0; buf[i]; i++) {
1115011152
if (!isalnum(buf[i]))
1115111153
buf[i] = '_';
@@ -11270,9 +11272,9 @@ int probe_kern_syscall_wrapper(int token_fd)
1127011272

1127111273
return pfd >= 0 ? 1 : 0;
1127211274
} else { /* legacy mode */
11273-
char probe_name[128];
11275+
char probe_name[MAX_EVENT_NAME_LEN];
1127411276

11275-
gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0);
11277+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0);
1127611278
if (add_kprobe_event_legacy(probe_name, false, syscall_name, 0) < 0)
1127711279
return 0;
1127811280

@@ -11328,10 +11330,10 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog,
1132811330
func_name, offset,
1132911331
-1 /* pid */, 0 /* ref_ctr_off */);
1133011332
} else {
11331-
char probe_name[256];
11333+
char probe_name[MAX_EVENT_NAME_LEN];
1133211334

11333-
gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name),
11334-
func_name, offset);
11335+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name),
11336+
func_name, offset);
1133511337

1133611338
legacy_probe = strdup(probe_name);
1133711339
if (!legacy_probe)
@@ -11875,20 +11877,6 @@ static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, stru
1187511877
return ret;
1187611878
}
1187711879

11878-
static void gen_uprobe_legacy_event_name(char *buf, size_t buf_sz,
11879-
const char *binary_path, uint64_t offset)
11880-
{
11881-
int i;
11882-
11883-
snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx", getpid(), binary_path, (size_t)offset);
11884-
11885-
/* sanitize binary_path in the probe name */
11886-
for (i = 0; buf[i]; i++) {
11887-
if (!isalnum(buf[i]))
11888-
buf[i] = '_';
11889-
}
11890-
}
11891-
1189211880
static inline int add_uprobe_event_legacy(const char *probe_name, bool retprobe,
1189311881
const char *binary_path, size_t offset)
1189411882
{
@@ -12312,13 +12300,14 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid,
1231212300
pfd = perf_event_open_probe(true /* uprobe */, retprobe, binary_path,
1231312301
func_offset, pid, ref_ctr_off);
1231412302
} else {
12315-
char probe_name[PATH_MAX + 64];
12303+
char probe_name[MAX_EVENT_NAME_LEN];
1231612304

1231712305
if (ref_ctr_off)
1231812306
return libbpf_err_ptr(-EINVAL);
1231912307

12320-
gen_uprobe_legacy_event_name(probe_name, sizeof(probe_name),
12321-
binary_path, func_offset);
12308+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name),
12309+
strrchr(binary_path, '/') ? : binary_path,
12310+
func_offset);
1232212311

1232312312
legacy_probe = strdup(probe_name);
1232412313
if (!legacy_probe)

0 commit comments

Comments
 (0)