Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05cbaa28 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

perf: Fix NULL deref in inheritance code



Liming found a NULL deref when a task has a perf context but no
counters  when it forks.

This can occur in two cases, a race during construction where
the fork hits after installing the context but before the first
counter gets inserted, or more reproducably, a fork after the
last counter is closed (which leaves the context around).

Reported-by: default avatarWang Liming <liming.wang@windriver.com>
Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
CC: <stable@kernel.org>
LKML-Reference: <1262185684.7135.222.camel@laptop>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 48b5ba9c
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -5148,7 +5148,7 @@ int perf_event_init_task(struct task_struct *child)
					    GFP_KERNEL);
			if (!child_ctx) {
				ret = -ENOMEM;
				goto exit;
				break;
			}

			__perf_event_init_context(child_ctx, child);
@@ -5164,7 +5164,7 @@ int perf_event_init_task(struct task_struct *child)
		}
	}

	if (inherited_all) {
	if (child_ctx && inherited_all) {
		/*
		 * Mark the child context as a clone of the parent
		 * context, or of whatever the parent is a clone of.
@@ -5184,7 +5184,6 @@ int perf_event_init_task(struct task_struct *child)
		get_ctx(child_ctx->parent_ctx);
	}

exit:
	mutex_unlock(&parent_ctx->mutex);

	perf_unpin_context(parent_ctx);