summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2022-12-19 15:40:04 +0100
committerPeter Zijlstra <peterz@infradead.org>2022-12-27 12:44:01 +0100
commita551844e345ba2a1c533dee4b55cb0efddb1bcda (patch)
treeb9e9745bfecbd4c4739d4511fc76802bbae2bb4c
parent08245672cdc6505550d1a5020603b0a8d4a6dcc7 (diff)
downloadlinux-a551844e345ba2a1c533dee4b55cb0efddb1bcda.tar.bz2
perf: Fix use-after-free in error path
The syscall error path has a use-after-free; put_pmu_ctx() will reference ctx, therefore we must ensure ctx is destroyed after pmu_ctx is. Fixes: bd2756811766 ("perf: Rewrite core context handling") Reported-by: syzbot+b8e8c01c8ade4fe6e48f@syzkaller.appspotmail.com Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Chengming Zhou <zhouchengming@bytedance.com> Link: https://lkml.kernel.org/r/Y6B3xEgkbmFUCeni@hirez.programming.kicks-ass.net
-rw-r--r--kernel/events/core.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 37c0f04d7a00..63d674c9b70e 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -12671,7 +12671,8 @@ SYSCALL_DEFINE5(perf_event_open,
return event_fd;
err_context:
- /* event->pmu_ctx freed by free_event() */
+ put_pmu_ctx(event->pmu_ctx);
+ event->pmu_ctx = NULL; /* _free_event() */
err_locked:
mutex_unlock(&ctx->mutex);
perf_unpin_context(ctx);
@@ -12784,6 +12785,7 @@ perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu,
err_pmu_ctx:
put_pmu_ctx(pmu_ctx);
+ event->pmu_ctx = NULL; /* _free_event() */
err_unlock:
mutex_unlock(&ctx->mutex);
perf_unpin_context(ctx);