Skip to content

Commit 3587bee

Browse files
kknjhgregkh
authored andcommitted
libbpf: Fix event name too long error
[ Upstream commit 4dde20b ] 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]> Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/bpf/[email protected] Signed-off-by: Sasha Levin <[email protected]>
1 parent 034c179 commit 3587bee

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))
@@ -11039,16 +11041,16 @@ static const char *tracefs_available_filter_functions_addrs(void)
1103911041
: TRACEFS"/available_filter_functions_addrs";
1104011042
}
1104111043

11042-
static void gen_kprobe_legacy_event_name(char *buf, size_t buf_sz,
11043-
const char *kfunc_name, size_t offset)
11044+
static void gen_probe_legacy_event_name(char *buf, size_t buf_sz,
11045+
const char *name, size_t offset)
1104411046
{
1104511047
static int index = 0;
1104611048
int i;
1104711049

11048-
snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx_%d", getpid(), kfunc_name, offset,
11049-
__sync_fetch_and_add(&index, 1));
11050+
snprintf(buf, buf_sz, "libbpf_%u_%d_%s_0x%zx", getpid(),
11051+
__sync_fetch_and_add(&index, 1), name, offset);
1105011052

11051-
/* sanitize binary_path in the probe name */
11053+
/* sanitize name in the probe name */
1105211054
for (i = 0; buf[i]; i++) {
1105311055
if (!isalnum(buf[i]))
1105411056
buf[i] = '_';
@@ -11174,9 +11176,9 @@ int probe_kern_syscall_wrapper(int token_fd)
1117411176

1117511177
return pfd >= 0 ? 1 : 0;
1117611178
} else { /* legacy mode */
11177-
char probe_name[128];
11179+
char probe_name[MAX_EVENT_NAME_LEN];
1117811180

11179-
gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0);
11181+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0);
1118011182
if (add_kprobe_event_legacy(probe_name, false, syscall_name, 0) < 0)
1118111183
return 0;
1118211184

@@ -11233,10 +11235,10 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog,
1123311235
func_name, offset,
1123411236
-1 /* pid */, 0 /* ref_ctr_off */);
1123511237
} else {
11236-
char probe_name[256];
11238+
char probe_name[MAX_EVENT_NAME_LEN];
1123711239

11238-
gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name),
11239-
func_name, offset);
11240+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name),
11241+
func_name, offset);
1124011242

1124111243
legacy_probe = strdup(probe_name);
1124211244
if (!legacy_probe)
@@ -11744,20 +11746,6 @@ static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, stru
1174411746
return ret;
1174511747
}
1174611748

11747-
static void gen_uprobe_legacy_event_name(char *buf, size_t buf_sz,
11748-
const char *binary_path, uint64_t offset)
11749-
{
11750-
int i;
11751-
11752-
snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx", getpid(), binary_path, (size_t)offset);
11753-
11754-
/* sanitize binary_path in the probe name */
11755-
for (i = 0; buf[i]; i++) {
11756-
if (!isalnum(buf[i]))
11757-
buf[i] = '_';
11758-
}
11759-
}
11760-
1176111749
static inline int add_uprobe_event_legacy(const char *probe_name, bool retprobe,
1176211750
const char *binary_path, size_t offset)
1176311751
{
@@ -12173,13 +12161,14 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid,
1217312161
pfd = perf_event_open_probe(true /* uprobe */, retprobe, binary_path,
1217412162
func_offset, pid, ref_ctr_off);
1217512163
} else {
12176-
char probe_name[PATH_MAX + 64];
12164+
char probe_name[MAX_EVENT_NAME_LEN];
1217712165

1217812166
if (ref_ctr_off)
1217912167
return libbpf_err_ptr(-EINVAL);
1218012168

12181-
gen_uprobe_legacy_event_name(probe_name, sizeof(probe_name),
12182-
binary_path, func_offset);
12169+
gen_probe_legacy_event_name(probe_name, sizeof(probe_name),
12170+
strrchr(binary_path, '/') ? : binary_path,
12171+
func_offset);
1218312172

1218412173
legacy_probe = strdup(probe_name);
1218512174
if (!legacy_probe)

0 commit comments

Comments
 (0)