Different behaviour between kernels 4.6 and 4.7: "Permission denied" on 4.6
- Dominant language
- C
- Stars
- 22.7k
- Forks
- 4.1k
- Avg merge
- 10d 4h
- Merged PRs (30d)
- 3
Description
@brendangregg, @4ast, @goldshtn
I run into different behaviour between kernels 4.4, 4.5, 4.6 and kernels 4.7, 4.8 on Ubuntu 16.04 LTS and Fedora:
Same tool works perfectly on 4.7, 4.8 and fails on earlier kernels with:
```
...
DEBUG:load_obj_code_into_ebpf_vm('kretprobe__SyS_memfd_create'):
0: (bf) r6 = r1
1: (85) call 5
2: (bf) r7 = r0
3: (85) call 14
4: (7b) *(u64 *)(r10 -360) = r0
5: (18) r1 = 0x4be85e80
7: (bf) r2 = r10
8: (07) r2 += -360
9: (85) call 1
10: (15) if r0 == 0x0 goto pc+43
R0=map_value(ks=8,vs=56) R6=ctx R7=inv R10=fp
11: (b7) r1 = 0
12: (7b) *(u64 *)(r10 -352) = r1
13: (b7) r1 = 319
14: (7b) *(u64 *)(r10 -320) = r1
15: (79) r1 = *(u64 *)(r0 +0)
16: (7b) *(u64 *)(r10 -304) = r1
17: (79) r1 = *(u64 *)(r0 +8)
18: (7b) *(u64 *)(r10 -296) = r1
19: (79) r1 = *(u64 *)(r0 +16)
20: (7b) *(u64 *)(r10 -288) = r1
21: (79) r1 = *(u64 *)(r0 +24)
22: (7b) *(u64 *)(r10 -280) = r1
23: (79) r1 = *(u64 *)(r0 +32)
24: (7b) *(u64 *)(r10 -272) = r1
25: (79) r1 = *(u64 *)(r0 +40)
26: (7b) *(u64 *)(r10 -264) = r1
27: (79) r1 = *(u64 *)(r10 -360)
28: (7b) *(u64 *)(r10 -344) = r1
29: (79) r1 = *(u64 *)(r0 +48)
30: (7b) *(u64 *)(r10 -336) = r1
31: (7b) *(u64 *)(r10 -328) = r7
32: (79) r1 = *(u64 *)(r6 +80)
33: (7b) *(u64 *)(r10 -312) = r1
34: (79) r3 = *(u64 *)(r0 +0)
35: (bf) r1 = r10
36: (07) r1 += -256
37: (b7) r2 = 255
38: (85) call 4
invalid indirect read from stack off -256+0 size 255
ERROR:load_obj_code_into_ebpf_vm:Failed to load BPF program kretprobe__SyS_memfd_create: Permission denied
...
```
If you have some ideas I will be happy to know. Appropriate source:
```C
//...
#include
#include
#include
//...
struct first_step_t {
s64 arg_1;
s64 arg_2;
s64 arg_3;
s64 arg_4;
s64 arg_5;
s64 arg_6;
u64 start_ts_nsec;
};
/* The set of our children_pid */
BPF_HASH(children_map, u64, u64);
BPF_HASH(tmp_i, u64, struct first_step_t);
BPF_PERF_OUTPUT(events);
//...
/*
* kretprobe__SyS_memfd_create -- SyS_memfd_create() exit handler
*/
int
kretprobe__SyS_memfd_create(struct pt_regs *ctx)
{
struct first_step_t *fsp;
enum { _pad_size = offsetof(struct ev_dt_t, aux_str) + NAME_MAX };
union {
struct ev_dt_t ev;
char _pad[_pad_size];
} u;
u64 cur_nsec = bpf_ktime_get_ns();
u64 pid_tid = bpf_get_current_pid_tgid();
fsp = tmp_i.lookup(&pid_tid);
if (fsp == 0)
return 0;
u.ev.packet_type = 0; /* No additional packets */
u.ev.sc_id = __NR_memfd_create; /* SysCall ID */
u.ev.arg_1 = fsp->arg_1;
u.ev.arg_2 = fsp->arg_2;
u.ev.arg_3 = fsp->arg_3;
u.ev.arg_4 = fsp->arg_4;
u.ev.arg_5 = fsp->arg_5;
u.ev.arg_6 = fsp->arg_6;
u.ev.pid_tid = pid_tid;
u.ev.start_ts_nsec = fsp->start_ts_nsec;
u.ev.finish_ts_nsec = cur_nsec;
u.ev.ret = PT_REGS_RC(ctx);
bpf_probe_read(&u.ev.aux_str, NAME_MAX, (void *)fsp->arg_1);
events.perf_submit(ctx, &u.ev, _pad_size);
tmp_i.delete(&pid_tid);
return 0;
}
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.