Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756798AbZLOJfn (ORCPT ); Tue, 15 Dec 2009 04:35:43 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751099AbZLOJfm (ORCPT ); Tue, 15 Dec 2009 04:35:42 -0500 Received: from ozlabs.org ([203.10.76.45]:56158 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750902AbZLOJfj (ORCPT ); Tue, 15 Dec 2009 04:35:39 -0500 Date: Tue, 15 Dec 2009 19:40:32 +1100 From: Paul Mackerras To: Ingo Molnar , Peter Zijlstra Cc: linux-kernel@vger.kernel.org, Michael Neuling Subject: [PATCH 1/2] perf_event: Fix incorrect range check on cpu number Message-ID: <20091215084032.GA18661@brick.ozlabs.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1515 Lines: 39 It is quite legitimate for CPUs to be numbered sparsely, meaning that it possible for an online CPU to have a number which is greater than the total count of possible CPUs. Currently find_get_context() has a sanity check on the cpu number where it checks it against num_possible_cpus(). This test can fail for a legitimate cpu number if the cpu_possible_mask is sparsely populated. This fixes the problem by checking the CPU number against nr_cpumask_bits instead, since that is the appropriate check to ensure that the cpu number is same to pass to cpu_isset() subsequently. Reported-by: Michael Neuling Tested-by: Michael Neuling Cc: stable@kernel.org Signed-off-by: Paul Mackerras --- kernel/perf_event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 6b7ddba..78551b3 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c @@ -1604,7 +1604,7 @@ static struct perf_event_context *find_get_context(pid_t pid, int cpu) if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) return ERR_PTR(-EACCES); - if (cpu < 0 || cpu > num_possible_cpus()) + if (cpu < 0 || cpu >= nr_cpumask_bits) return ERR_PTR(-EINVAL); /* -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/