From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753555AbbF3Ewj (ORCPT ); Tue, 30 Jun 2015 00:52:39 -0400 Received: from terminus.zytor.com ([198.137.202.10]:38383 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750794AbbF3Ewe (ORCPT ); Tue, 30 Jun 2015 00:52:34 -0400 Date: Mon, 29 Jun 2015 21:52:13 -0700 From: tip-bot for Arnaldo Carvalho de Melo Message-ID: Cc: dsahern@gmail.com, tglx@linutronix.de, fweisbec@gmail.com, linux-kernel@vger.kernel.org, namhyung@kernel.org, bp@suse.de, jolsa@redhat.com, hpa@zytor.com, mingo@kernel.org, dzickus@redhat.com, adrian.hunter@intel.com, acme@redhat.com, fbl@redhat.com Reply-To: dzickus@redhat.com, mingo@kernel.org, fbl@redhat.com, adrian.hunter@intel.com, acme@redhat.com, tglx@linutronix.de, dsahern@gmail.com, namhyung@kernel.org, linux-kernel@vger.kernel.org, fweisbec@gmail.com, bp@suse.de, hpa@zytor.com, jolsa@redhat.com To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/urgent] perf trace: Validate syscall list passed via -e argument Git-Commit-ID: d0cc439b30be638c3a606767e9469c300d397433 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: d0cc439b30be638c3a606767e9469c300d397433 Gitweb: http://git.kernel.org/tip/d0cc439b30be638c3a606767e9469c300d397433 Author: Arnaldo Carvalho de Melo AuthorDate: Thu, 25 Jun 2015 19:32:33 -0300 Committer: Arnaldo Carvalho de Melo CommitDate: Fri, 26 Jun 2015 10:47:41 -0300 perf trace: Validate syscall list passed via -e argument The 'trace' tool was accepting any names passed and just looking if syscalls returned via the raw_syscalls:* tracepoints were in that list, leading to it accepting perf events and then never finding any, as those are not valid syscall names, confusing users. Fix it by checking each entry in the list using audit_name_to_syscall, telling the user which entries are invalid and suggesting where to look for valid syscall names. E.g: [root@zoo ~]# trace -e open,foo,bar,close,baz Error: Invalid syscall bar, baz, foo Hint: try 'perf list syscalls:sys_enter_*' Hint: and: 'man syscalls' [root@zoo ~]# Reported-by: Flavio Leitner Cc: Adrian Hunter Cc: Borislav Petkov Cc: David Ahern Cc: Don Zickus Cc: Frederic Weisbecker Cc: Jiri Olsa Cc: Namhyung Kim Link: http://lkml.kernel.org/n/tip-4g1i3m1z6fzsrznn2umi02wa@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-trace.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 2bf2ca7..39ad4d0 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -1617,6 +1617,34 @@ static int trace__read_syscall_info(struct trace *trace, int id) return syscall__set_arg_fmts(sc); } +static int trace__validate_ev_qualifier(struct trace *trace) +{ + int err = 0; + struct str_node *pos; + + strlist__for_each(pos, trace->ev_qualifier) { + const char *sc = pos->s; + + if (audit_name_to_syscall(sc, trace->audit.machine) < 0) { + if (err == 0) { + fputs("Error:\tInvalid syscall ", trace->output); + err = -EINVAL; + } else { + fputs(", ", trace->output); + } + + fputs(sc, trace->output); + } + } + + if (err < 0) { + fputs("\nHint:\ttry 'perf list syscalls:sys_enter_*'" + "\nHint:\tand: 'man syscalls'\n", trace->output); + } + + return err; +} + /* * args is to be interpreted as a series of longs but we need to handle * 8-byte unaligned accesses. args points to raw_data within the event @@ -2862,6 +2890,10 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) err = -ENOMEM; goto out_close; } + + err = trace__validate_ev_qualifier(&trace); + if (err) + goto out_close; } err = target__validate(&trace.opts.target);