Commit a551844e authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files

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: bd275681 ("perf: Rewrite core context handling")
Reported-by: default avatar <syzbot+b8e8c01c8ade4fe6e48f@syzkaller.appspotmail.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: default avatarChengming Zhou <zhouchengming@bytedance.com>
Link: https://lkml.kernel.org/r/Y6B3xEgkbmFUCeni@hirez.programming.kicks-ass.net
parent 08245672
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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);