From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934439AbcIPL7n (ORCPT ); Fri, 16 Sep 2016 07:59:43 -0400 Received: from terminus.zytor.com ([198.137.202.10]:40384 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757813AbcIPL7X (ORCPT ); Fri, 16 Sep 2016 07:59:23 -0400 Date: Fri, 16 Sep 2016 04:58:30 -0700 From: tip-bot for Alexander Shishkin Message-ID: Cc: linux-kernel@vger.kernel.org, acme@infradead.org, tglx@linutronix.de, jolsa@redhat.com, hpa@zytor.com, a.p.zijlstra@chello.nl, peterz@infradead.org, eranian@google.com, acme@redhat.com, vincent.weaver@maine.edu, alexander.shishkin@linux.intel.com, torvalds@linux-foundation.org, adrian.hunter@intel.com, mingo@kernel.org Reply-To: acme@infradead.org, linux-kernel@vger.kernel.org, tglx@linutronix.de, a.p.zijlstra@chello.nl, hpa@zytor.com, eranian@google.com, peterz@infradead.org, jolsa@redhat.com, alexander.shishkin@linux.intel.com, vincent.weaver@maine.edu, acme@redhat.com, mingo@kernel.org, torvalds@linux-foundation.org, adrian.hunter@intel.com In-Reply-To: <20160915151352.21306-3-alexander.shishkin@linux.intel.com> References: <20160915151352.21306-3-alexander.shishkin@linux.intel.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/urgent] perf/x86/intel/pt: Fix kernel address filter's offset validation Git-Commit-ID: ddfdad991e55b65c1cc4ee29502f6dceee04455a X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: ddfdad991e55b65c1cc4ee29502f6dceee04455a Gitweb: http://git.kernel.org/tip/ddfdad991e55b65c1cc4ee29502f6dceee04455a Author: Alexander Shishkin AuthorDate: Thu, 15 Sep 2016 18:13:51 +0300 Committer: Ingo Molnar CommitDate: Fri, 16 Sep 2016 11:14:16 +0200 perf/x86/intel/pt: Fix kernel address filter's offset validation The kernel_ip() filter is used mostly by the DS/LBR code to look at the branch addresses, but Intel PT also uses it to validate the address filter offsets for kernel addresses, for which it is not sufficient: supplying something in bits 64:48 that's not a sign extension of the lower address bits (like 0xf00d000000000000) throws a #GP. This patch adds address validation for the user supplied kernel filters. Reported-by: Adrian Hunter Signed-off-by: Alexander Shishkin Acked-by: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Arnaldo Carvalho de Melo Cc: Jiri Olsa Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Thomas Gleixner Cc: Vince Weaver Cc: stable@vger.kernel.org # v4.7 Cc: stable@vger.kernel.org#v4.7 Cc: vince@deater.net Link: http://lkml.kernel.org/r/20160915151352.21306-3-alexander.shishkin@linux.intel.com Signed-off-by: Ingo Molnar --- arch/x86/events/intel/pt.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c index 5ec0100..1f94963 100644 --- a/arch/x86/events/intel/pt.c +++ b/arch/x86/events/intel/pt.c @@ -1074,6 +1074,11 @@ static void pt_addr_filters_fini(struct perf_event *event) event->hw.addr_filters = NULL; } +static inline bool valid_kernel_ip(unsigned long ip) +{ + return virt_addr_valid(ip) && kernel_ip(ip); +} + static int pt_event_addr_filters_validate(struct list_head *filters) { struct perf_addr_filter *filter; @@ -1084,7 +1089,7 @@ static int pt_event_addr_filters_validate(struct list_head *filters) if (!filter->range || !filter->size) return -EOPNOTSUPP; - if (!filter->inode && !kernel_ip(filter->offset)) + if (!filter->inode && !valid_kernel_ip(filter->offset)) return -EINVAL; if (++range > pt_cap_get(PT_CAP_num_address_ranges))