Skip to content

Commit 2d03b9f

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 <[email protected]> Signed-off-by: Feng Yang <[email protected]>
1 parent 679d783 commit 2d03b9f

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))
@@ -11121,16 +11123,16 @@ static const char *tracefs_available_filter_functions_addrs(void)
1112111123
: TRACEFS"/available_filter_functions_addrs";
1112211124
}
1112311125

11124-
static void gen_kprobe_legacy_event_name(char *buf, size_t buf_sz,
11125-
const char *kfunc_name, size_t offset)
11126+
static void gen_probe_legacy_event_name(char *buf, size_t buf_sz,
11127+
const char *name, size_t offset)
1112611128
{
1112711129
static int index = 0;
1112811130
int i;
1112911131

11130-
snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx_%d", getpid(), kfunc_name, offset,
11131-
__sync_fetch_and_add(&index, 1));
11132+
snprintf(buf, buf_sz, "libbpf_%u_%d_%s_0x%zx", getpid(),
11133+
__sync_fetch_and_add(&index, 1), name, offset);
1113211134

11133-
/* sanitize binary_path in the probe name */
11135+
/* sanitize name in the probe name */
1113411136
for (i = 0; buf[i]; i++) {
1113511137
if (!isalnum(buf[i]))
1113611138
buf[i] = '_';
@@ -11255,9 +11257,9 @@ int probe_kern_syscall_wrapper(int token_fd)
1125511257

1125611258
return pfd >= 0 ? 1 : 0;
1125711259
} else { /* legacy mode */
11258-
char probe_name[128];
11260+
char probe_name[MAX_EVENT_NAME_LEN];
1125911261

11260-
gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0);
11262+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0);
1126111263
if (add_kprobe_event_legacy(probe_name, false, syscall_name, 0) < 0)
1126211264
return 0;
1126311265

@@ -11313,10 +11315,10 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog,
1131311315
func_name, offset,
1131411316
-1 /* pid */, 0 /* ref_ctr_off */);
1131511317
} else {
11316-
char probe_name[256];
11318+
char probe_name[MAX_EVENT_NAME_LEN];
1131711319

11318-
gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name),
11319-
func_name, offset);
11320+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name),
11321+
func_name, offset);
1132011322

1132111323
legacy_probe = strdup(probe_name);
1132211324
if (!legacy_probe)
@@ -11860,20 +11862,6 @@ static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, stru
1186011862
return ret;
1186111863
}
1186211864

11863-
static void gen_uprobe_legacy_event_name(char *buf, size_t buf_sz,
11864-
const char *binary_path, uint64_t offset)
11865-
{
11866-
int i;
11867-
11868-
snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx", getpid(), binary_path, (size_t)offset);
11869-
11870-
/* sanitize binary_path in the probe name */
11871-
for (i = 0; buf[i]; i++) {
11872-
if (!isalnum(buf[i]))
11873-
buf[i] = '_';
11874-
}
11875-
}
11876-
1187711865
static inline int add_uprobe_event_legacy(const char *probe_name, bool retprobe,
1187811866
const char *binary_path, size_t offset)
1187911867
{
@@ -12297,13 +12285,14 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid,
1229712285
pfd = perf_event_open_probe(true /* uprobe */, retprobe, binary_path,
1229812286
func_offset, pid, ref_ctr_off);
1229912287
} else {
12300-
char probe_name[PATH_MAX + 64];
12288+
char probe_name[MAX_EVENT_NAME_LEN];
1230112289

1230212290
if (ref_ctr_off)
1230312291
return libbpf_err_ptr(-EINVAL);
1230412292

12305-
gen_uprobe_legacy_event_name(probe_name, sizeof(probe_name),
12306-
binary_path, func_offset);
12293+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name),
12294+
strrchr(binary_path, '/') ? : binary_path,
12295+
func_offset);
1230712296

1230812297
legacy_probe = strdup(probe_name);
1230912298
if (!legacy_probe)

0 commit comments

Comments
 (0)