On Tue, Aug 01, 2017 at 11:30:04PM -0700, Yonghong Song wrote: > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 426c2ff..623c977 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -8050,7 +8050,7 @@ static void perf_event_free_bpf_handler(struct > perf_event *event) > > static int perf_event_set_bpf_prog(struct perf_event *event, u32 prog_fd) > { > - bool is_kprobe, is_tracepoint; > + bool is_cap_any, is_kprobe, is_tracepoint; > struct bpf_prog *prog; > > if (event->attr.type != PERF_TYPE_TRACEPOINT) > @@ -8059,9 +8059,11 @@ static int perf_event_set_bpf_prog(struct perf_event > *event, u32 prog_fd) > if (event->tp_event->prog) > return -EEXIST; > > + /* currently, CAP_ANY only for sys_enter_* and sys_exit_* tracepoints */ > + is_cap_any = event->tp_event->flags & TRACE_EVENT_FL_CAP_ANY; > is_kprobe = event->tp_event->flags & TRACE_EVENT_FL_UKPROBE; > is_tracepoint = event->tp_event->flags & TRACE_EVENT_FL_TRACEPOINT; > - if (!is_kprobe && !is_tracepoint) > + if (!is_cap_any && !is_kprobe && !is_tracepoint) > /* bpf programs can only be attached to u/kprobe or tracepoint > */ > return -EINVAL; > > @@ -8070,7 +8072,8 @@ static int perf_event_set_bpf_prog(struct perf_event > *event, u32 prog_fd) > return PTR_ERR(prog); > > if ((is_kprobe && prog->type != BPF_PROG_TYPE_KPROBE) || > - (is_tracepoint && prog->type != BPF_PROG_TYPE_TRACEPOINT)) { > + (is_tracepoint && prog->type != BPF_PROG_TYPE_TRACEPOINT) || > + (is_cap_any && prog->type != BPF_PROG_TYPE_TRACEPOINT)) { > /* valid fd, but invalid bpf program type */ > bpf_prog_put(prog); > return -EINVAL;
This looks wrong. FL_CAP_ANY is a privilege thing, not something that identifies syscall hooks (it just so happens only those now have the bit set, but that's an accident more than anything else).