From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756532AbbHGHXu (ORCPT ); Fri, 7 Aug 2015 03:23:50 -0400 Received: from terminus.zytor.com ([198.137.202.10]:39738 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756511AbbHGHXr (ORCPT ); Fri, 7 Aug 2015 03:23:47 -0400 Date: Fri, 7 Aug 2015 00:23:36 -0700 From: tip-bot for Adrian Hunter Message-ID: Cc: adrian.hunter@intel.com, mingo@kernel.org, linux-kernel@vger.kernel.org, jolsa@redhat.com, hpa@zytor.com, acme@redhat.com, tglx@linutronix.de Reply-To: tglx@linutronix.de, acme@redhat.com, hpa@zytor.com, linux-kernel@vger.kernel.org, jolsa@redhat.com, adrian.hunter@intel.com, mingo@kernel.org In-Reply-To: <1437150840-31811-16-git-send-email-adrian.hunter@intel.com> References: <1437150840-31811-16-git-send-email-adrian.hunter@intel.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf tools: Validate config term maximum value Git-Commit-ID: 0efe6b67690b6546daa0d2f34a17eb3ca46c9dea 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: 0efe6b67690b6546daa0d2f34a17eb3ca46c9dea Gitweb: http://git.kernel.org/tip/0efe6b67690b6546daa0d2f34a17eb3ca46c9dea Author: Adrian Hunter AuthorDate: Fri, 17 Jul 2015 19:33:50 +0300 Committer: Arnaldo Carvalho de Melo CommitDate: Thu, 6 Aug 2015 16:49:28 -0300 perf tools: Validate config term maximum value Currently the value of a PMU config term is silently truncated if it is too big. This is an impediment to validating the value for other criteria later on i.e. the user provides an invalid value that gets truncated to a valid one. The maximum value validation is only done for the parser where the error is passed back to the user. In other cases the silent truncation continues so as not to affect tools that perhaps rely on it. Signed-off-by: Adrian Hunter Cc: Jiri Olsa Link: http://lkml.kernel.org/r/1437150840-31811-16-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/pmu.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index c548ec8..d4b0e64 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -589,6 +589,18 @@ static void pmu_format_value(unsigned long *format, __u64 value, __u64 *v, } } +static __u64 pmu_format_max_value(const unsigned long *format) +{ + int w; + + w = bitmap_weight(format, PERF_PMU_FORMAT_BITS); + if (!w) + return 0; + if (w < 64) + return (1ULL << w) - 1; + return -1; +} + /* * Term is a string term, and might be a param-term. Try to look up it's value * in the remaining terms. @@ -662,7 +674,7 @@ static int pmu_config_term(struct list_head *formats, { struct perf_pmu_format *format; __u64 *vp; - __u64 val; + __u64 val, max_val; /* * If this is a parameter we've already used for parameterized-eval, @@ -728,6 +740,22 @@ static int pmu_config_term(struct list_head *formats, } else return -EINVAL; + max_val = pmu_format_max_value(format->bits); + if (val > max_val) { + if (err) { + err->idx = term->err_val; + if (asprintf(&err->str, + "value too big for format, maximum is %llu", + (unsigned long long)max_val) < 0) + err->str = strdup("value too big for format"); + return -EINVAL; + } + /* + * Assume we don't care if !err, in which case the value will be + * silently truncated. + */ + } + pmu_format_value(format->bits, val, vp, zero); return 0; }