X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=kernel%2Fevents%2Fcallchain.c;h=98d4597f43d69e35a76535fac7d0bb6821ebdf7f;hb=e6dab5ffab59e910ec0e3355f4a6f29f7a7be474;hp=6581a040f39926dd46878640413bfd180922415a;hpb=4a247a4119ee932e06e985e0a95a13c3eed4715b;p=deliverable%2Flinux.git diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c index 6581a040f399..98d4597f43d6 100644 --- a/kernel/events/callchain.c +++ b/kernel/events/callchain.c @@ -153,7 +153,8 @@ put_callchain_entry(int rctx) put_recursion_context(__get_cpu_var(callchain_recursion), rctx); } -struct perf_callchain_entry *perf_callchain(struct pt_regs *regs) +struct perf_callchain_entry * +perf_callchain(struct perf_event *event, struct pt_regs *regs) { int rctx; struct perf_callchain_entry *entry; @@ -178,6 +179,12 @@ struct perf_callchain_entry *perf_callchain(struct pt_regs *regs) } if (regs) { + /* + * Disallow cross-task user callchains. + */ + if (event->ctx->task && event->ctx->task != current) + goto exit_put; + perf_callchain_store(entry, PERF_CONTEXT_USER); perf_callchain_user(entry, regs); }