From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753408AbdHQRWg (ORCPT ); Thu, 17 Aug 2017 13:22:36 -0400 Received: from mail.kernel.org ([198.145.29.99]:54608 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752270AbdHQRWe (ORCPT ); Thu, 17 Aug 2017 13:22:34 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5EF442170E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=acme@kernel.org Date: Thu, 17 Aug 2017 14:22:32 -0300 From: Arnaldo Carvalho de Melo To: Andi Kleen Cc: Andi Kleen , jolsa@kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 2/2] perf, tools: Avoid segfault on alias parse error Message-ID: <20170817172232.GF10891@kernel.org> References: <20170816220201.19182-1-andi@firstfloor.org> <20170816220201.19182-3-andi@firstfloor.org> <20170817152816.GC10891@kernel.org> <20170817164213.GE10891@kernel.org> <20170817170453.GL28715@tassilo.jf.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170817170453.GL28715@tassilo.jf.intel.com> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.8.3 (2017-05-23) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Thu, Aug 17, 2017 at 10:04:53AM -0700, Andi Kleen escreveu: > > So it will _not_ set to null a member that it doesn't have, i.e. the > > minimal fix is to just have the hunks below, making sure that the error > > field is present in both structs. No need to set > > parse_event_terms->error to anything, it will be set to null since other > > fields are set to something. > > Right but I want to see the error too. That is why I added a real > error handler. Ok, but I was first trying to figure out the fix for that separate problem (the void pointer being dereferenced to two different types in the same function, yyparse, aka parse_events_parse), then we can go to the 'too' part :-) I'm adding the patch below, that should fix things by using just one state struct for parsing. This is done on top of another that renames 'struct parse_events_evlist' to a more clearer 'struct parse_events_state'. I'll then add what is left of your patch, run tests and we go from there, holler if I'm now missing something. - Arnaldo diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 272eab7f5ac8..d4fcf048aa9e 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1656,7 +1656,7 @@ static int parse_events__scanner(const char *str, void *data, int start_token) */ int parse_events_terms(struct list_head *terms, const char *str) { - struct parse_events_terms data = { + struct parse_events_state data = { .terms = NULL, }; int ret; diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 8fff8423469b..2a3617937894 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -114,10 +114,7 @@ struct parse_events_state { int nr_groups; struct parse_events_error *error; struct perf_evlist *evlist; -}; - -struct parse_events_terms { - struct list_head *terms; + struct list_head *terms; }; void parse_events__shrink_config_terms(void); diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index ffb4914142cf..8acb2c4ca711 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -494,7 +494,7 @@ opt_event_config: start_terms: event_config { - struct parse_events_terms *data = _data; + struct parse_events_state *data = _data; data->terms = $1; }