From patchwork Wed Oct 23 00:53:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1181732 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="IG1MQEnu"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46yX306xydz9sPV for ; Wed, 23 Oct 2019 11:54:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733271AbfJWAyv (ORCPT ); Tue, 22 Oct 2019 20:54:51 -0400 Received: from mail-pl1-f202.google.com ([209.85.214.202]:56740 "EHLO mail-pl1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732229AbfJWAyE (ORCPT ); Tue, 22 Oct 2019 20:54:04 -0400 Received: by mail-pl1-f202.google.com with SMTP id y2so145240plp.23 for ; Tue, 22 Oct 2019 17:54:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=Hvl11X8G79qfzptKicQV7uupBd7BKCDNwU1VoFozVWw=; b=IG1MQEnulSwyMGomBYhK5FRCkgOvrHQfxf10IfN7ozmVN/PZ0Ccj4DEM33CXCR6z+a xaxWjAXq/MZ2tLzP+iAprwB7QqsvCjql+4B1TDDr4n6bEI1Rzk5FIxISav+IkXFL+7Oj W1GV6G/V2zmkcawEfG4pxSvopsVcmKQNneNV2NIYSsSY2K9usQlj+EogKnpZad8OkiFs Vq9+nNsDs2zLElWeqFHCLVJLgOOBV2X5EmGGp6ZCeuE3y92QaKRrIM31/PuaHWdGyKFM Mh0iH+cQSTvyFZr/85m+/9zuyF3RMAGiNdN1qRz7fs2VW9V2+G6BhSxsVq+l68STf5G2 OyvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=Hvl11X8G79qfzptKicQV7uupBd7BKCDNwU1VoFozVWw=; b=iJP6rGUHP9iNZx6GK9IaZo2lMdzkIENIBe9J3NimY/rNGOX2a0gNBA60vZHjUgppWQ h2YhofyobahkFNFmdqrLw8S7pjXl7JeAVtFfiOhS3e3x4MdI8Gttq9dpDC/O/llu5iyq 4VOpHBSgZn7EJ0Xm01rLhQjiRLCL0hjjM7XDqbuowwHumr8rDzMViNxNirQoU5XFfigt x4N8CWoqlvuhM2Meq6zIOJBKJzMsmju1pSI8NzL1cY/wMBvcno48ToRxv0I/tINR35S6 aOkt+W9awYcjbJLIiQYIAvpK63t/oTm5qaDIK+vsL+QkAOtgp6cFiyZd6dOxO55e1NPO 1RIw== X-Gm-Message-State: APjAAAVTtYkK9kYXG5lG81RaoqD44zuNR3ozwSOIQ+9OG6m9yHaNWYIJ yi3qcdQzs86CKgl9ENMlVR0ZWcDGNZo6 X-Google-Smtp-Source: APXvYqwI0k7iK6s8rsvO6IQH5HK4CMeRWp6dILPLypvDaNIOn1n4FTVz5DmyeTjDJqc4bRIWbzkmljCwZQ3V X-Received: by 2002:a63:1511:: with SMTP id v17mr6824541pgl.34.1571792041077; Tue, 22 Oct 2019 17:54:01 -0700 (PDT) Date: Tue, 22 Oct 2019 17:53:29 -0700 In-Reply-To: <20191023005337.196160-1-irogers@google.com> Message-Id: <20191023005337.196160-2-irogers@google.com> Mime-Version: 1.0 References: <20191017170531.171244-1-irogers@google.com> <20191023005337.196160-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v2 1/9] perf tools: add parse events append error From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Parse event error handling may overwrite one error string with another creating memory leaks and masking errors. Introduce a helper routine that appends error messages and avoids the memory leak. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.c | 102 ++++++++++++++++++++++----------- tools/perf/util/parse-events.h | 2 + tools/perf/util/pmu.c | 36 ++++++------ 3 files changed, 89 insertions(+), 51 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index db882f630f7e..4d42344698b8 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -182,6 +182,34 @@ static int tp_event_has_id(const char *dir_path, struct dirent *evt_dir) #define MAX_EVENT_LENGTH 512 +void parse_events__append_error(struct parse_events_error *err, int idx, + char *str, char *help) +{ + char *new_str = NULL; + + WARN(!str, "WARNING: failed to provide error string"); + if (err->str) { + int ret; + + if (err->help) + ret = asprintf(&new_str, + "%s (previous error: %s(help: %s))", + str, err->str, err->help); + else + ret = asprintf(&new_str, + "%s (previous error: %s)", + str, err->str); + if (ret < 0) + new_str = NULL; + else + zfree(&str); + } + err->idx = idx; + free(err->str); + err->str = new_str ?: str; + free(err->help); + err->help = help; +} struct tracepoint_path *tracepoint_id_to_path(u64 config) { @@ -931,13 +959,12 @@ static int check_type_val(struct parse_events_term *term, if (type == term->type_val) return 0; - if (err) { - err->idx = term->err_val; - if (type == PARSE_EVENTS__TERM_TYPE_NUM) - err->str = strdup("expected numeric value"); - else - err->str = strdup("expected string value"); - } + if (err) + parse_events__append_error(err, term->err_val, + type == PARSE_EVENTS__TERM_TYPE_NUM + ? strdup("expected numeric value") + : strdup("expected string value"), + NULL); return -EINVAL; } @@ -972,8 +999,11 @@ static bool config_term_shrinked; static bool config_term_avail(int term_type, struct parse_events_error *err) { + char *err_str; + if (term_type < 0 || term_type >= __PARSE_EVENTS__TERM_TYPE_NR) { - err->str = strdup("Invalid term_type"); + parse_events__append_error(err, -1, + strdup("Invalid term_type"), NULL); return false; } if (!config_term_shrinked) @@ -992,9 +1022,9 @@ config_term_avail(int term_type, struct parse_events_error *err) return false; /* term_type is validated so indexing is safe */ - if (asprintf(&err->str, "'%s' is not usable in 'perf stat'", - config_term_names[term_type]) < 0) - err->str = NULL; + if (asprintf(&err_str, "'%s' is not usable in 'perf stat'", + config_term_names[term_type]) >= 0) + parse_events__append_error(err, -1, err_str, NULL); return false; } } @@ -1036,17 +1066,20 @@ do { \ case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE: CHECK_TYPE_VAL(STR); if (strcmp(term->val.str, "no") && - parse_branch_str(term->val.str, &attr->branch_sample_type)) { - err->str = strdup("invalid branch sample type"); - err->idx = term->err_val; + parse_branch_str(term->val.str, + &attr->branch_sample_type)) { + parse_events__append_error(err, term->err_val, + strdup("invalid branch sample type"), + NULL); return -EINVAL; } break; case PARSE_EVENTS__TERM_TYPE_TIME: CHECK_TYPE_VAL(NUM); if (term->val.num > 1) { - err->str = strdup("expected 0 or 1"); - err->idx = term->err_val; + parse_events__append_error(err, term->err_val, + strdup("expected 0 or 1"), + NULL); return -EINVAL; } break; @@ -1080,8 +1113,9 @@ do { \ case PARSE_EVENTS__TERM_TYPE_PERCORE: CHECK_TYPE_VAL(NUM); if ((unsigned int)term->val.num > 1) { - err->str = strdup("expected 0 or 1"); - err->idx = term->err_val; + parse_events__append_error(err, term->err_val, + strdup("expected 0 or 1"), + NULL); return -EINVAL; } break; @@ -1089,9 +1123,9 @@ do { \ CHECK_TYPE_VAL(NUM); break; default: - err->str = strdup("unknown term"); - err->idx = term->err_term; - err->help = parse_events_formats_error_string(NULL); + parse_events__append_error(err, term->err_term, + strdup("unknown term"), + parse_events_formats_error_string(NULL)); return -EINVAL; } @@ -1141,11 +1175,10 @@ static int config_term_tracepoint(struct perf_event_attr *attr, case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT: return config_term_common(attr, term, err); default: - if (err) { - err->idx = term->err_term; - err->str = strdup("unknown term"); - err->help = strdup("valid terms: call-graph,stack-size\n"); - } + if (err) + parse_events__append_error(err, term->err_term, + strdup("unknown term"), + strdup("valid terms: call-graph,stack-size\n")); return -EINVAL; } @@ -1323,10 +1356,12 @@ int parse_events_add_pmu(struct parse_events_state *parse_state, pmu = perf_pmu__find(name); if (!pmu) { - if (asprintf(&err->str, + char *err_str; + + if (asprintf(&err_str, "Cannot find PMU `%s'. Missing kernel support?", - name) < 0) - err->str = NULL; + name) >= 0) + parse_events__append_error(err, -1, err_str, NULL); return -EINVAL; } @@ -2797,13 +2832,10 @@ void parse_events__clear_array(struct parse_events_array *a) void parse_events_evlist_error(struct parse_events_state *parse_state, int idx, const char *str) { - struct parse_events_error *err = parse_state->error; - - if (!err) + if (!parse_state->error) return; - err->idx = idx; - err->str = strdup(str); - WARN_ONCE(!err->str, "WARNING: failed to allocate error string"); + + parse_events__append_error(parse_state->error, idx, strdup(str), NULL); } static void config_terms_list(char *buf, size_t buf_sz) diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 769e07cddaa2..a7d42faeab0c 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -124,6 +124,8 @@ struct parse_events_state { struct list_head *terms; }; +void parse_events__append_error(struct parse_events_error *err, int idx, + char *str, char *help); void parse_events__shrink_config_terms(void); int parse_events__is_hardcoded_term(struct parse_events_term *term); int parse_events_term__num(struct parse_events_term **term, diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index adbe97e941dd..0fc2a51bb953 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1050,9 +1050,9 @@ static int pmu_config_term(struct list_head *formats, if (err) { char *pmu_term = pmu_formats_string(formats); - err->idx = term->err_term; - err->str = strdup("unknown term"); - err->help = parse_events_formats_error_string(pmu_term); + parse_events__append_error(err, term->err_term, + strdup("unknown term"), + parse_events_formats_error_string(pmu_term)); free(pmu_term); } return -EINVAL; @@ -1079,10 +1079,10 @@ static int pmu_config_term(struct list_head *formats, if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) { if (term->no_value && bitmap_weight(format->bits, PERF_PMU_FORMAT_BITS) > 1) { - if (err) { - err->idx = term->err_val; - err->str = strdup("no value assigned for term"); - } + if (err) + parse_events__append_error(err, term->err_val, + strdup("no value assigned for term"), + NULL); return -EINVAL; } @@ -1093,10 +1093,10 @@ static int pmu_config_term(struct list_head *formats, pr_info("Invalid sysfs entry %s=%s\n", term->config, term->val.str); } - if (err) { - err->idx = term->err_val; - err->str = strdup("expected numeric value"); - } + if (err) + parse_events__append_error(err, term->err_val, + strdup("expected numeric value"), + NULL); return -EINVAL; } @@ -1108,11 +1108,15 @@ static int pmu_config_term(struct list_head *formats, 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"); + char *err_str; + + parse_events__append_error(err, term->err_val, + asprintf(&err_str, + "value too big for format, maximum is %llu", + (unsigned long long)max_val) < 0 + ? strdup("value too big for format") + : err_str, + NULL); return -EINVAL; } /* From patchwork Wed Oct 23 00:53:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1181716 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="dxp56W5Q"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46yX293Qyqz9sPh for ; Wed, 23 Oct 2019 11:54:09 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732384AbfJWAyF (ORCPT ); Tue, 22 Oct 2019 20:54:05 -0400 Received: from mail-pg1-f201.google.com ([209.85.215.201]:56992 "EHLO mail-pg1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732334AbfJWAyE (ORCPT ); Tue, 22 Oct 2019 20:54:04 -0400 Received: by mail-pg1-f201.google.com with SMTP id u4so13800557pgp.23 for ; Tue, 22 Oct 2019 17:54:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=orKMDyFq0pxDsmp0+soEOe34Z3iGwylS1aF6XcYLmDY=; b=dxp56W5QwoEHYr+VvlnDojJFQ2s5Jr00cBo2UlZtUhbLztqDX+v6+mFLiFTmFce6QW upwIV8Rb7h9vSzOV5rCKmO/VSgT7BjrhF61lxGDW61AFZDGWzaayL/+597j709GkCi0K 5rt3aQ2QeeayYfKJQ3lcb0LVh0i6yEutFUwWaWPtq+YPMOwqkW0jf9D83dbFi9F99gdS KnF088Q2o6Af0a44MJQKk7o6My2hjCNyEk+VeoK2UfTTar3KkzLwaIUqUh/ZwrY3FsVW gMFBtHZ/psrnbjZJJYDvno+NZqro2sxpRd6v2a0VIJ/42OdJaudV25DhgeWP532RlMy7 ycbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=orKMDyFq0pxDsmp0+soEOe34Z3iGwylS1aF6XcYLmDY=; b=O2Cgqpy4X1iXZ0Y+ULi00teaTFmVKJqgaqO0KeC4s91IdAbvVcmbOftdfWgwR3Q2wj 0KRhtpaWvGlgyn+87L/f5bDGt807ynziNELP/e+nMaXmO5TQl+Q9YpjD66VRaoI70DUY aC2939AsqS8r5vLMO+Olz2Ja7HOKEhhwnppRld1gKViEGjBO8nhjmEODlHXD/YpbrWGd hjw9SVKJjYuVtsQ+M4RuqOng+zqW8yUACbTV5QLaEKVsLkhhkUhH/8Fd9bYwehcdThJd EydJYW2v/3Omr+Y7ofUstrzaxxvbc+PnxKa8lddctwsiHhUG1D9ch4D7D0DGlFVhni6P QtVw== X-Gm-Message-State: APjAAAWmlKQ4Xn9MY7xK+tSVjLHBPJL6dM1W/ZvKwcKXvgnzMGGgJUK0 5sFLX1oGB5jAUKYXPHLIZKvAP+vkaczy X-Google-Smtp-Source: APXvYqzyVIwLoq+9wyp9C7zURVMoBQyLpOCJQ6F7p/ccsS8pjZFa43S0nRwH0x7KWI+lYdhQ17E8tgEaTCrC X-Received: by 2002:a63:1904:: with SMTP id z4mr6951997pgl.413.1571792043458; Tue, 22 Oct 2019 17:54:03 -0700 (PDT) Date: Tue, 22 Oct 2019 17:53:30 -0700 In-Reply-To: <20191023005337.196160-1-irogers@google.com> Message-Id: <20191023005337.196160-3-irogers@google.com> Mime-Version: 1.0 References: <20191017170531.171244-1-irogers@google.com> <20191023005337.196160-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v2 2/9] perf tools: splice events onto evlist even on error From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If event parsing fails the event list is leaked, instead splice the list onto the out result and let the caller cleanup. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 4d42344698b8..a8f8801bd127 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1962,15 +1962,20 @@ int parse_events(struct evlist *evlist, const char *str, ret = parse_events__scanner(str, &parse_state, PE_START_EVENTS); perf_pmu__parse_cleanup(); + + if (list_empty(&parse_state.list)) { + WARN_ONCE(true, "WARNING: event parser found nothing\n"); + return -1; + } + + /* + * Add list to the evlist even with errors to allow callers to clean up. + */ + perf_evlist__splice_list_tail(evlist, &parse_state.list); + if (!ret) { struct evsel *last; - if (list_empty(&parse_state.list)) { - WARN_ONCE(true, "WARNING: event parser found nothing\n"); - return -1; - } - - perf_evlist__splice_list_tail(evlist, &parse_state.list); evlist->nr_groups += parse_state.nr_groups; last = evlist__last(evlist); last->cmdline_group_boundary = true; From patchwork Wed Oct 23 00:53:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1181730 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="aD+ecd8q"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46yX2w3L6zz9sPf for ; Wed, 23 Oct 2019 11:54:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732588AbfJWAyJ (ORCPT ); Tue, 22 Oct 2019 20:54:09 -0400 Received: from mail-pg1-f201.google.com ([209.85.215.201]:34562 "EHLO mail-pg1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732491AbfJWAyI (ORCPT ); Tue, 22 Oct 2019 20:54:08 -0400 Received: by mail-pg1-f201.google.com with SMTP id l11so6264519pgg.1 for ; Tue, 22 Oct 2019 17:54:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=FMgQDO+Dnj5IilbdBYKNu48aqofIvdKnV+5Czp2NCJk=; b=aD+ecd8qy5XtTCWk57ZL9YxyPdxh61JhJmiWz5tbPXcunacXfmH4RlJVWnFs275uEc 3ToWc6yaeXXrZGHeJutdTeyWtSRvNshxMGBD8C1ep5Yp1WJzgqgYjc5x0A7GLMbrwzjG YRuXjQP1DxkSygys3+x+DZ2TZvQzbnwEx00bO6NMOXB9NNvuEudMkhjV8WnhtRPOIGNW baLqIgipOvh3Jpc5gQJdQui3X9GBWZhdrzF/GtXueJoQ0gw5tDNKQ4P0HC3mG+rYbBgB 20riwU0+CTB4jy1DCXT6Lfw7kdt0QmRsc1WuL/Y0mKh8anrr4OXReXj5244zTaHOtACQ 8jCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=FMgQDO+Dnj5IilbdBYKNu48aqofIvdKnV+5Czp2NCJk=; b=Z1SJ1za/ja4I2YMg/tmj1kP3NBVCCXity4DKWb7oAZAevSJ/SrgH205ld0FDq+oSxU IRVDHx92EC/egeIVOHNr5lXBwKQgTTmiwyqjitXHnk2r1E+GCjf5iVlHTC+EVAC4p7Y+ uCnOFS7rt30Sxr5cuI3DnE89cvXvliSjhoYmSMibiaAg9ConTPXrlGQ4Jbuj/W2gEHE8 CDJLQiq2ih+4sH7YsoOgHIcXElN0fOGtUisaPGeTOidGIlL6ZMbqoOi5HQ27JE2vqnBH ZXI/JU2f2BVamHppNEnYk1zyZ8nQDIK35qY2GcYYfJLpAvsZBMTcoHKhemPruH/mAmXi ZVsw== X-Gm-Message-State: APjAAAVsnOhI0oP+MK9EjqRevsesSKQclJtcvINpA8/krKqWFJZTIEae +pXqRvvbk1nu0pDGO8yWZtvv0ubvwur7 X-Google-Smtp-Source: APXvYqyREqZX+QnAAEVJzMEdYSL+vkbj69zfIuRXQ7/lc6aXG4ZLFgqIA3xEwdGAgjqe9gGRsmIemsZ/K483 X-Received: by 2002:a63:ce0d:: with SMTP id y13mr842966pgf.430.1571792046163; Tue, 22 Oct 2019 17:54:06 -0700 (PDT) Date: Tue, 22 Oct 2019 17:53:31 -0700 In-Reply-To: <20191023005337.196160-1-irogers@google.com> Message-Id: <20191023005337.196160-4-irogers@google.com> Mime-Version: 1.0 References: <20191017170531.171244-1-irogers@google.com> <20191023005337.196160-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v2 3/9] perf tools: ensure config and str in terms are unique From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Make it easier to release memory associated with parse event terms by duplicating the string for the config name and ensuring the val string is a duplicate. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.c | 33 ++++++++++++++++++++++++--------- tools/perf/util/parse-events.y | 4 +++- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index a8f8801bd127..f7c8d0853d71 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1424,7 +1424,6 @@ int parse_events_add_pmu(struct parse_events_state *parse_state, int parse_events_multi_pmu_add(struct parse_events_state *parse_state, char *str, struct list_head **listp) { - struct list_head *head; struct parse_events_term *term; struct list_head *list; struct perf_pmu *pmu = NULL; @@ -1441,19 +1440,30 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, list_for_each_entry(alias, &pmu->aliases, list) { if (!strcasecmp(alias->name, str)) { + struct list_head *head; + char *config; + head = malloc(sizeof(struct list_head)); if (!head) return -1; INIT_LIST_HEAD(head); - if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - str, 1, false, &str, NULL) < 0) + config = strdup(str); + if (!config) + return -1; + if (parse_events_term__num(&term, + PARSE_EVENTS__TERM_TYPE_USER, + config, 1, false, &config, + NULL) < 0) { + free(list); + free(config); return -1; + } list_add_tail(&term->list, head); if (!parse_events_add_pmu(parse_state, list, pmu->name, head, true, true)) { - pr_debug("%s -> %s/%s/\n", str, + pr_debug("%s -> %s/%s/\n", config, pmu->name, alias->str); ok++; } @@ -1462,8 +1472,10 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, } } } - if (!ok) + if (!ok) { + free(list); return -1; + } *listp = list; return 0; } @@ -2761,13 +2773,13 @@ int parse_events_term__sym_hw(struct parse_events_term **term, struct parse_events_term temp = { .type_val = PARSE_EVENTS__TERM_TYPE_STR, .type_term = PARSE_EVENTS__TERM_TYPE_USER, - .config = config ?: (char *) "event", + .config = config ?: strdup("event"), }; BUG_ON(idx >= PERF_COUNT_HW_MAX); sym = &event_symbols_hw[idx]; - return new_term(term, &temp, (char *) sym->symbol, 0); + return new_term(term, &temp, strdup(sym->symbol), 0); } int parse_events_term__clone(struct parse_events_term **new, @@ -2776,12 +2788,15 @@ int parse_events_term__clone(struct parse_events_term **new, struct parse_events_term temp = { .type_val = term->type_val, .type_term = term->type_term, - .config = term->config, + .config = term->config ? strdup(term->config) : NULL, .err_term = term->err_term, .err_val = term->err_val, }; - return new_term(new, &temp, term->val.str, term->val.num); + if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) + return new_term(new, &temp, NULL, term->val.num); + else + return new_term(new, &temp, strdup(term->val.str), 0); } int parse_events_copy_term_list(struct list_head *old, diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 48126ae4cd13..27d6b187c9b1 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -644,9 +644,11 @@ PE_NAME array '=' PE_VALUE PE_DRV_CFG_TERM { struct parse_events_term *term; + char *config = strdup($1); + ABORT_ON(!config); ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, - $1, $1, &@1, NULL)); + config, $1, &@1, NULL)); $$ = term; } From patchwork Wed Oct 23 00:53:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1181718 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="h/cpUy8C"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46yX2F3TB5z9sPV for ; Wed, 23 Oct 2019 11:54:13 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732664AbfJWAyL (ORCPT ); Tue, 22 Oct 2019 20:54:11 -0400 Received: from mail-pf1-f202.google.com ([209.85.210.202]:41719 "EHLO mail-pf1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732491AbfJWAyK (ORCPT ); Tue, 22 Oct 2019 20:54:10 -0400 Received: by mail-pf1-f202.google.com with SMTP id 22so14769434pfx.8 for ; Tue, 22 Oct 2019 17:54:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=9DHgkR7cmmDrBt85CUovVuVoj+UrHvSyU5cnghVTVvs=; b=h/cpUy8CeHXPtFnFFPIACFR5sXcecGIHFQ/QgVWaUuozo/3VR4Tu8Kpwk970Lz6/br DIecaWLzRE7spwcQpQVIEMaRQORdeWL4GohPKiQZROOGePmhlA9Ncfuj8XJWe6waqI05 hrwPfzIdqETNeU6+ttvJ62ZCpdJowmMa5SOPuokxhpJx/9x1lrK1CHKyYqGwzP1lXxZU 7F2yNHwRUyW8ZYSAdeRISG3H0fEl9yWuCaQe1GOZ4uXAKYCQ8bIHtL3ztq4c2LRbD0U4 Z8KkM3xk57Gfb2bLXwwBy7sH0b5jPbfnXi4JIYImT5I8K4Z6x6JB6B8HkeXgOLYWeBik JNsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=9DHgkR7cmmDrBt85CUovVuVoj+UrHvSyU5cnghVTVvs=; b=D+nLq98EInhKb7F+vdFy1VJla/Oy6XB0oTPIRHZQiWP64jcKq4IuXsc9XF2WUXUSqT bELtwVCCjKFc5h4YtbZCGf3QmxNg76ARMDUc0BjEqj9wM4Dt90J1ZhnqwA6+IzYdHb9H vTa7qug05ghPWh8/iFd2aEuXo5s/sNhqiMafSTfV/oBSyVN/F93/5eknWwv5wzw1g24Z V8xfLRtOUpHi9Q4ERsrtI1YKBSDmrfDp0QOBuIk7gWeBIc7gCr8Re13+RyORIXPxtreb d+q9QXVyIundJv0MP2KVGjyiXpEOwYTv4oTSInTUQkBVmxDSqXpVpZZMJX0qRVCnl4Li +WKA== X-Gm-Message-State: APjAAAUVmU29is+Cx2Oh0BSMo/WGms7xbBax5PeNmEfaCbRomqqMdeWR XjMt+0xfRL+p2hW9Hktun+fVluZzN5dG X-Google-Smtp-Source: APXvYqzMeF7LftoJr1Rwi7pLVz72zEzoGLPIJungsJGWyePO3vKeSxDXDQPZ+YL2vT4Ok2hvYlAAkR9AS45U X-Received: by 2002:a63:1209:: with SMTP id h9mr3469286pgl.394.1571792048914; Tue, 22 Oct 2019 17:54:08 -0700 (PDT) Date: Tue, 22 Oct 2019 17:53:32 -0700 In-Reply-To: <20191023005337.196160-1-irogers@google.com> Message-Id: <20191023005337.196160-5-irogers@google.com> Mime-Version: 1.0 References: <20191017170531.171244-1-irogers@google.com> <20191023005337.196160-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v2 4/9] perf tools: move ALLOC_LIST into a function From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Having a YYABORT in a macro makes it hard to free memory for components of a rule. Separate the logic out. Signed-off-by: Ian Rogers Acked-by: Jiri Olsa --- tools/perf/util/parse-events.y | 65 ++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 27d6b187c9b1..26cb65798522 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -25,12 +25,17 @@ do { \ YYABORT; \ } while (0) -#define ALLOC_LIST(list) \ -do { \ - list = malloc(sizeof(*list)); \ - ABORT_ON(!list); \ - INIT_LIST_HEAD(list); \ -} while (0) +static struct list_head* alloc_list() +{ + struct list_head *list; + + list = malloc(sizeof(*list)); + if (!list) + return NULL; + + INIT_LIST_HEAD(list); + return list; +} static void inc_group_count(struct list_head *list, struct parse_events_state *parse_state) @@ -238,7 +243,8 @@ PE_NAME opt_pmu_config if (error) error->idx = @1.first_column; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); if (parse_events_add_pmu(_parse_state, list, $1, $2, false, false)) { struct perf_pmu *pmu = NULL; int ok = 0; @@ -306,7 +312,8 @@ value_sym '/' event_config '/' int type = $1 >> 16; int config = $1 & 255; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, $3)); parse_events_terms__delete($3); $$ = list; @@ -318,7 +325,8 @@ value_sym sep_slash_slash_dc int type = $1 >> 16; int config = $1 & 255; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL)); $$ = list; } @@ -327,7 +335,8 @@ PE_VALUE_SYM_TOOL sep_slash_slash_dc { struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_tool(_parse_state, list, $1)); $$ = list; } @@ -339,7 +348,8 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_e struct parse_events_error *error = parse_state->error; struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, $5, error, $6)); parse_events_terms__delete($6); $$ = list; @@ -351,7 +361,8 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config struct parse_events_error *error = parse_state->error; struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, NULL, error, $4)); parse_events_terms__delete($4); $$ = list; @@ -363,7 +374,8 @@ PE_NAME_CACHE_TYPE opt_event_config struct parse_events_error *error = parse_state->error; struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, NULL, NULL, error, $2)); parse_events_terms__delete($2); $$ = list; @@ -375,7 +387,8 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc struct parse_events_state *parse_state = _parse_state; struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, (void *) $2, $6, $4)); $$ = list; @@ -386,7 +399,8 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc struct parse_events_state *parse_state = _parse_state; struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, (void *) $2, NULL, $4)); $$ = list; @@ -397,7 +411,8 @@ PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc struct parse_events_state *parse_state = _parse_state; struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, (void *) $2, $4, 0)); $$ = list; @@ -408,7 +423,8 @@ PE_PREFIX_MEM PE_VALUE sep_dc struct parse_events_state *parse_state = _parse_state; struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, (void *) $2, NULL, 0)); $$ = list; @@ -421,7 +437,8 @@ tracepoint_name opt_event_config struct parse_events_error *error = parse_state->error; struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); if (error) error->idx = @1.first_column; @@ -457,7 +474,8 @@ PE_VALUE ':' PE_VALUE opt_event_config { struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4)); parse_events_terms__delete($4); $$ = list; @@ -468,7 +486,8 @@ PE_RAW opt_event_config { struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2)); parse_events_terms__delete($2); $$ = list; @@ -480,7 +499,8 @@ PE_BPF_OBJECT opt_event_config struct parse_events_state *parse_state = _parse_state; struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_load_bpf(parse_state, list, $1, false, $2)); parse_events_terms__delete($2); $$ = list; @@ -490,7 +510,8 @@ PE_BPF_SOURCE opt_event_config { struct list_head *list; - ALLOC_LIST(list); + list = alloc_list(); + ABORT_ON(!list); ABORT_ON(parse_events_load_bpf(_parse_state, list, $1, true, $2)); parse_events_terms__delete($2); $$ = list; From patchwork Wed Oct 23 00:53:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1181719 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="BL8dfNYw"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46yX2H2Gdyz9sPh for ; Wed, 23 Oct 2019 11:54:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732685AbfJWAyN (ORCPT ); Tue, 22 Oct 2019 20:54:13 -0400 Received: from mail-pf1-f201.google.com ([209.85.210.201]:51290 "EHLO mail-pf1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732674AbfJWAyM (ORCPT ); Tue, 22 Oct 2019 20:54:12 -0400 Received: by mail-pf1-f201.google.com with SMTP id s137so14735465pfs.18 for ; Tue, 22 Oct 2019 17:54:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=98x/ZBLRTnMz91JDf+r9eCkgM4R/aoJz7oABA29poQw=; b=BL8dfNYwle/qgbtW7ADVHiEsSuwDsPLSjZoTlfXnyBE0oqkv1xRRcAwpwnjTG/UhRy ISsJthzTeEQUMS7g0lCGJbG93C5BRxPyP8lId+AdASqwo84DykO2wLDNuaAxqKA1IX/O iTR6Luj0jJI3JE5RMfuZvTBQdZTsfSyjj/FPLjdWOQKtb/rP4LSTf3FG61gkWGbAM1QQ uys3F9C2nkJ19ZClEX2bMBki9FW87OhkyJlk0k+bgKEzX+VdNwbnee3KVbObhucc/ZHO dwiV1/bRVl14YMNAKrWD7i9S/1x8sGDRth318qZKTokTijAHXJaIzF6W5tB20o9btapG N9BA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=98x/ZBLRTnMz91JDf+r9eCkgM4R/aoJz7oABA29poQw=; b=dNyMMeEx14v+B+3BtP/08WuOUYn1s3dOJmpCL6oeo1D3mmc998UpprklHSXywJVyG8 dUz4aC5VyZc0d9jfA2gCx9BsIRXWQ+i8Xqf/oMCI8uXx4lKYgRv6SudKzb23ZsNxHYpc r1hgChmVYkk3Fvc7tf/XOsfBXyshU46gfdw0Q4VvFdSh6H00dxhlSFDyXTH+PSed++o/ lmd7P06LZf3isNkENt/8dzkiNgNvVOJB2pH3HJUOnfZE+s9F+LqqwdJtKsrQp8Tvda+U vos8s7hAaJPeX3MoNdjZbr92ljxbzmPxdfFyQKmU8sLtiPJ9DwxINKRJiWJNs9YNn6Xv znDw== X-Gm-Message-State: APjAAAUdS5t/TwNlHuu+owbTCZFWAER4AvY4pDBtgChCK17sU3Y9OqcE WWO0ftb7oHZ0VUdJRI+WWuvJxyzwkQ2N X-Google-Smtp-Source: APXvYqwtREz6g9G/rGR93rQsNY/2ZLedqbEtW+Xi7gR2wUD6zXu9bFlMVAC8iCLgsGQ/ldKSRBkh98pzxPJx X-Received: by 2002:a63:1666:: with SMTP id 38mr2072471pgw.93.1571792051528; Tue, 22 Oct 2019 17:54:11 -0700 (PDT) Date: Tue, 22 Oct 2019 17:53:33 -0700 In-Reply-To: <20191023005337.196160-1-irogers@google.com> Message-Id: <20191023005337.196160-6-irogers@google.com> Mime-Version: 1.0 References: <20191017170531.171244-1-irogers@google.com> <20191023005337.196160-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v2 5/9] perf tools: avoid a malloc for array events From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Use realloc rather than malloc+memcpy to possibly avoid a memory allocation when appending array elements. Signed-off-by: Ian Rogers Acked-by: Jiri Olsa --- tools/perf/util/parse-events.y | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 26cb65798522..545ab7cefc20 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -691,14 +691,12 @@ array_terms ',' array_term struct parse_events_array new_array; new_array.nr_ranges = $1.nr_ranges + $3.nr_ranges; - new_array.ranges = malloc(sizeof(new_array.ranges[0]) * - new_array.nr_ranges); + new_array.ranges = realloc($1.ranges, + sizeof(new_array.ranges[0]) * + new_array.nr_ranges); ABORT_ON(!new_array.ranges); - memcpy(&new_array.ranges[0], $1.ranges, - $1.nr_ranges * sizeof(new_array.ranges[0])); memcpy(&new_array.ranges[$1.nr_ranges], $3.ranges, $3.nr_ranges * sizeof(new_array.ranges[0])); - free($1.ranges); free($3.ranges); $$ = new_array; } From patchwork Wed Oct 23 00:53:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1181720 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="nz2uurdi"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46yX2N2SWBz9sPh for ; Wed, 23 Oct 2019 11:54:20 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733080AbfJWAyR (ORCPT ); Tue, 22 Oct 2019 20:54:17 -0400 Received: from mail-pg1-f201.google.com ([209.85.215.201]:41104 "EHLO mail-pg1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732913AbfJWAyQ (ORCPT ); Tue, 22 Oct 2019 20:54:16 -0400 Received: by mail-pg1-f201.google.com with SMTP id s125so13833609pgc.8 for ; Tue, 22 Oct 2019 17:54:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=5ErD/uUW7vtCV74qLmYJVVPg+bMOBGzP+X5HkC35T58=; b=nz2uurdimjtldNTEoiMbb+rZ7G6+/McOYNx3KBrG80NV8yIYQCsVz+nZZ64wjXn/CD 194GMWoqLJKDaHgh348xPChUS2ZdNA8yfMtHFsaphbhOgU4pV1O8kRsA8vpsGMErkhoj 2xVkP5gGBwd1/Ze9WU/sHaXlFhfK655QyKXE5GeZv7YBQFoDJhksFk9YaNnvJH8vNTau 8PWgPHVPZaaaVCYDGnLqbQ975KiKdmnWlD/AxK8gcc/miyNAn/lwWmzNUR5qxxPIyAJN L+P3vDMqaUUbRxx+deiXD+SVNpXMcKFY1sEkEUD5GNbDae87brG+/icY+y7PWfCtslZ4 d66A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=5ErD/uUW7vtCV74qLmYJVVPg+bMOBGzP+X5HkC35T58=; b=iQeFwl1YsjQVcgVBCumonTfMWoTcv5MMSrnkrYhKdzrZlznRFUm8huvr2NhYkVY+Tx CSV6U6aPaZ9jz06giDl9vrsUyB8sM+Y8tfcwnqLPTTQxC2oCoNmAySo6cEG/uB9pK1X0 /tU4kIG36DAixiUsogYUZzRwn3qSXva9hT5mHac4EHVzUOEvoLn83a+nTHg2miEPqHCR UGM3UY/mjMIxIYjnXHr3gi/oTadt3tL/d0AMcH9Vvk/R5FPaV5VAoSSQkUTMbpE4ms1V 46EGS4PBvSeuiD44kF//GF0rhqqMHgaCLGhOSSthR+arXjOSF289YeF5abSvgiQUxpG8 zJEw== X-Gm-Message-State: APjAAAVn1xcw/et+nsZV+Zk1x7/4zmSP5+OqQrLVzjGJHS65lbuO50jr BGAhkmtBS/Gigu4np9Duo4mm7GmOT0jN X-Google-Smtp-Source: APXvYqw68MRltqDbbSVJXBzvXcrD1zPG/SpAMuWzVbvPk288n4oOn7iZOhweSgAzWN/4RfD4Mm+Aurb8OQBb X-Received: by 2002:a63:7c14:: with SMTP id x20mr49380pgc.208.1571792054270; Tue, 22 Oct 2019 17:54:14 -0700 (PDT) Date: Tue, 22 Oct 2019 17:53:34 -0700 In-Reply-To: <20191023005337.196160-1-irogers@google.com> Message-Id: <20191023005337.196160-7-irogers@google.com> Mime-Version: 1.0 References: <20191017170531.171244-1-irogers@google.com> <20191023005337.196160-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v2 6/9] perf tools: add destructors for parse event terms From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If parsing fails then destructors are ran to clean the up the stack. Rename the head union member to make the term and evlist use cases more distinct, this simplifies matching the correct destructor. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.y | 69 +++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 545ab7cefc20..4725b14b9db4 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -12,6 +12,7 @@ #include #include #include +#include #include "pmu.h" #include "evsel.h" #include "parse-events.h" @@ -37,6 +38,25 @@ static struct list_head* alloc_list() return list; } +static void free_list_evsel(struct list_head* list_evsel) +{ + struct perf_evsel *pos, *tmp; + + list_for_each_entry_safe(pos, tmp, list_evsel, node) { + list_del_init(&pos->node); + perf_evsel__delete(pos); + } + free(list_evsel); +} + +static void free_term(struct parse_events_term *term) +{ + if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) + free(term->val.str); + zfree(&term->array.ranges); + free(term); +} + static void inc_group_count(struct list_head *list, struct parse_events_state *parse_state) { @@ -66,6 +86,7 @@ static void inc_group_count(struct list_head *list, %type PE_VALUE_SYM_TOOL %type PE_RAW %type PE_TERM +%type value_sym %type PE_NAME %type PE_BPF_OBJECT %type PE_BPF_SOURCE @@ -76,37 +97,43 @@ static void inc_group_count(struct list_head *list, %type PE_EVENT_NAME %type PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT %type PE_DRV_CFG_TERM -%type value_sym -%type event_config -%type opt_event_config -%type opt_pmu_config +%destructor { free ($$); } %type event_term -%type event_pmu -%type event_legacy_symbol -%type event_legacy_cache -%type event_legacy_mem -%type event_legacy_tracepoint +%destructor { free_term ($$); } +%type event_config +%type opt_event_config +%type opt_pmu_config +%destructor { parse_events_terms__delete ($$); } +%type event_pmu +%type event_legacy_symbol +%type event_legacy_cache +%type event_legacy_mem +%type event_legacy_tracepoint +%type event_legacy_numeric +%type event_legacy_raw +%type event_bpf_file +%type event_def +%type event_mod +%type event_name +%type event +%type events +%type group_def +%type group +%type groups +%destructor { free_list_evsel ($$); } %type tracepoint_name -%type event_legacy_numeric -%type event_legacy_raw -%type event_bpf_file -%type event_def -%type event_mod -%type event_name -%type event -%type events -%type group_def -%type group -%type groups +%destructor { free ($$.sys); free ($$.event); } %type array %type array_term %type array_terms +%destructor { free ($$.ranges); } %union { char *str; u64 num; - struct list_head *head; + struct list_head *list_evsel; + struct list_head *list_terms; struct parse_events_term *term; struct tracepoint_name { char *sys; From patchwork Wed Oct 23 00:53:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1181721 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="vU9Nva4n"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46yX2P6H35z9sPc for ; Wed, 23 Oct 2019 11:54:21 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733163AbfJWAyV (ORCPT ); Tue, 22 Oct 2019 20:54:21 -0400 Received: from mail-pf1-f202.google.com ([209.85.210.202]:42263 "EHLO mail-pf1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732677AbfJWAyS (ORCPT ); Tue, 22 Oct 2019 20:54:18 -0400 Received: by mail-pf1-f202.google.com with SMTP id w16so14771090pfj.9 for ; Tue, 22 Oct 2019 17:54:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=Eei92dL823o7tet+Ip4WaSABxxdMEUUGpCFLcr5LKjQ=; b=vU9Nva4nrJ9ocpJ4U2cW/r1BB12zalwqLOjqiulEgLHpUNLRIhljy5fyKXTqodnlyc jo9PNKJq7UQpyoZ/gLf88cO0NNXNWfEziKDc8XF+OpJ2gKrJeh3VByhkk+xd4H/tkwtq vwZBWuNfE2UpU7U3lSQR5pKvoOvHkWFAovDw7Fu96nQSgCxqL6Q/2aP0n2mKjEUzyFiM I4UyQ7eyUHjp9WKM7KC8SappuaSi5o4E3+sFPY9fvHepeohXmvWB+qYagzIp5qs8bKW/ wFc/ADbed+PQi4XtK32igHeY/BKy5kKYOXvF6MDWfTSKh+Q0uw6xAC8CCu4ts5Wl6pAG zEUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=Eei92dL823o7tet+Ip4WaSABxxdMEUUGpCFLcr5LKjQ=; b=de6TuEt5GWlAMknQ8wryaqvBtfx6VHLKiY9+8Ryky7hjXm8XTgkPalbpiD7QyQYtli Ea9yMBtu9WunHcz6xXhbtVAxVBY8caWauMRYaNeEEcMRxgmUxvq98W7wB8xzsS6bJbT7 uuL5knLpu3LlxZ3jX8RzPzVWcSNSQRWSEPIqYVYfbiaPy3LkLuOQneBrrxM9582JOfrw 8CyLCCzxp+cdab47QUbYQUb0qXurplFjOjn0kZtM158WZtyug40l5wrh6J73bhVH3ra/ oB6yRE0WwaRTMpUdcYTQ208Xuax1mfGiEr3kZURX+6Fc7MNqvJmvoQpLsCkYH/zp3SwH h+nw== X-Gm-Message-State: APjAAAUEIqt9uFneG+/QQ8502QFChpUlz26gGX78Y6ml/q+5EPXcg2Sr VVpv0hw4i+UqxjM2TnmfOuYsg3V75FRS X-Google-Smtp-Source: APXvYqxa3zImBUDxonWgg0Z0hHH2Y4+PxoOJUsIEtvQaCZHSLLukguLHqmPjTaeip9XRqq7LOPOCn5kDJfwH X-Received: by 2002:a63:d806:: with SMTP id b6mr6860540pgh.122.1571792056943; Tue, 22 Oct 2019 17:54:16 -0700 (PDT) Date: Tue, 22 Oct 2019 17:53:35 -0700 In-Reply-To: <20191023005337.196160-1-irogers@google.com> Message-Id: <20191023005337.196160-8-irogers@google.com> Mime-Version: 1.0 References: <20191017170531.171244-1-irogers@google.com> <20191023005337.196160-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v2 7/9] perf tools: before yyabort-ing free components From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Yyabort doesn't destruct inputs and so this must be done manually before using yyabort. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.y | 250 +++++++++++++++++++++++++-------- 1 file changed, 195 insertions(+), 55 deletions(-) diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 4725b14b9db4..d1cceb3bc620 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -152,6 +152,7 @@ start_events: groups { struct parse_events_state *parse_state = _parse_state; + /* frees $1 */ parse_events_update_lists($1, &parse_state->list); } @@ -161,6 +162,7 @@ groups ',' group struct list_head *list = $1; struct list_head *group = $3; + /* frees $3 */ parse_events_update_lists(group, list); $$ = list; } @@ -170,6 +172,7 @@ groups ',' event struct list_head *list = $1; struct list_head *event = $3; + /* frees $3 */ parse_events_update_lists(event, list); $$ = list; } @@ -182,8 +185,14 @@ group: group_def ':' PE_MODIFIER_EVENT { struct list_head *list = $1; + int err; - ABORT_ON(parse_events__modifier_group(list, $3)); + err = parse_events__modifier_group(list, $3); + free($3); + if (err) { + free_list_evsel(list); + YYABORT; + } $$ = list; } | @@ -196,6 +205,7 @@ PE_NAME '{' events '}' inc_group_count(list, _parse_state); parse_events__set_leader($1, list, _parse_state); + free($1); $$ = list; } | @@ -214,6 +224,7 @@ events ',' event struct list_head *event = $3; struct list_head *list = $1; + /* frees $3 */ parse_events_update_lists(event, list); $$ = list; } @@ -226,13 +237,19 @@ event_mod: event_name PE_MODIFIER_EVENT { struct list_head *list = $1; + int err; /* * Apply modifier on all events added by single event definition * (there could be more events added for multiple tracepoint * definitions via '*?'. */ - ABORT_ON(parse_events__modifier_event(list, $2, false)); + err = parse_events__modifier_event(list, $2, false); + free($2); + if (err) { + free_list_evsel(list); + YYABORT; + } $$ = list; } | @@ -241,8 +258,14 @@ event_name event_name: PE_EVENT_NAME event_def { - ABORT_ON(parse_events_name($2, $1)); + int err; + + err = parse_events_name($2, $1); free($1); + if (err) { + free_list_evsel($2); + YYABORT; + } $$ = $2; } | @@ -262,23 +285,32 @@ PE_NAME opt_pmu_config { struct parse_events_state *parse_state = _parse_state; struct parse_events_error *error = parse_state->error; - struct list_head *list, *orig_terms, *terms; + struct list_head *list = NULL, *orig_terms = NULL, *terms= NULL; + char *pattern = NULL; + +#define CLEANUP_YYABORT \ + do { \ + parse_events_terms__delete($2); \ + parse_events_terms__delete(orig_terms); \ + free($1); \ + YYABORT; \ + } while(0) if (parse_events_copy_term_list($2, &orig_terms)) - YYABORT; + CLEANUP_YYABORT; if (error) error->idx = @1.first_column; list = alloc_list(); - ABORT_ON(!list); + if (!list) + CLEANUP_YYABORT; if (parse_events_add_pmu(_parse_state, list, $1, $2, false, false)) { struct perf_pmu *pmu = NULL; int ok = 0; - char *pattern; if (asprintf(&pattern, "%s*", $1) < 0) - YYABORT; + CLEANUP_YYABORT; while ((pmu = perf_pmu__scan(pmu)) != NULL) { char *name = pmu->name; @@ -287,31 +319,32 @@ PE_NAME opt_pmu_config strncmp($1, "uncore_", 7)) name += 7; if (!fnmatch(pattern, name, 0)) { - if (parse_events_copy_term_list(orig_terms, &terms)) { - free(pattern); - YYABORT; - } + if (parse_events_copy_term_list(orig_terms, &terms)) + CLEANUP_YYABORT; if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms, true, false)) ok++; parse_events_terms__delete(terms); } } - free(pattern); - if (!ok) - YYABORT; + CLEANUP_YYABORT; } parse_events_terms__delete($2); parse_events_terms__delete(orig_terms); + free($1); $$ = list; +#undef CLEANUP_YYABORT } | PE_KERNEL_PMU_EVENT sep_dc { struct list_head *list; + int err; - if (parse_events_multi_pmu_add(_parse_state, $1, &list) < 0) + err = parse_events_multi_pmu_add(_parse_state, $1, &list); + free($1); + if (err < 0) YYABORT; $$ = list; } @@ -322,6 +355,8 @@ PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc char pmu_name[128]; snprintf(&pmu_name, 128, "%s-%s", $1, $3); + free($1); + free($3); if (parse_events_multi_pmu_add(_parse_state, pmu_name, &list) < 0) YYABORT; $$ = list; @@ -338,11 +373,16 @@ value_sym '/' event_config '/' struct list_head *list; int type = $1 >> 16; int config = $1 & 255; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, $3)); + err = parse_events_add_numeric(_parse_state, list, type, config, $3); parse_events_terms__delete($3); + if (err) { + free_list_evsel(list); + YYABORT; + } $$ = list; } | @@ -374,11 +414,19 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_e struct parse_events_state *parse_state = _parse_state; struct parse_events_error *error = parse_state->error; struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, $5, error, $6)); + err = parse_events_add_cache(list, &parse_state->idx, $1, $3, $5, error, $6); parse_events_terms__delete($6); + free($1); + free($3); + free($5); + if (err) { + free_list_evsel(list); + YYABORT; + } $$ = list; } | @@ -387,11 +435,18 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config struct parse_events_state *parse_state = _parse_state; struct parse_events_error *error = parse_state->error; struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, NULL, error, $4)); + err = parse_events_add_cache(list, &parse_state->idx, $1, $3, NULL, error, $4); parse_events_terms__delete($4); + free($1); + free($3); + if (err) { + free_list_evsel(list); + YYABORT; + } $$ = list; } | @@ -400,11 +455,17 @@ PE_NAME_CACHE_TYPE opt_event_config struct parse_events_state *parse_state = _parse_state; struct parse_events_error *error = parse_state->error; struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, NULL, NULL, error, $2)); + err = parse_events_add_cache(list, &parse_state->idx, $1, NULL, NULL, error, $2); parse_events_terms__delete($2); + free($1); + if (err) { + free_list_evsel(list); + YYABORT; + } $$ = list; } @@ -413,11 +474,17 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc { struct parse_events_state *parse_state = _parse_state; struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, - (void *) $2, $6, $4)); + err = parse_events_add_breakpoint(list, &parse_state->idx, + (void *) $2, $6, $4); + free($6); + if (err) { + free(list); + YYABORT; + } $$ = list; } | @@ -428,8 +495,11 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, - (void *) $2, NULL, $4)); + if (parse_events_add_breakpoint(list, &parse_state->idx, + (void *) $2, NULL, $4)) { + free(list); + YYABORT; + } $$ = list; } | @@ -437,11 +507,17 @@ PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc { struct parse_events_state *parse_state = _parse_state; struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, - (void *) $2, $4, 0)); + err = parse_events_add_breakpoint(list, &parse_state->idx, + (void *) $2, $4, 0); + free($4); + if (err) { + free(list); + YYABORT; + } $$ = list; } | @@ -452,8 +528,11 @@ PE_PREFIX_MEM PE_VALUE sep_dc list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, - (void *) $2, NULL, 0)); + if (parse_events_add_breakpoint(list, &parse_state->idx, + (void *) $2, NULL, 0)) { + free(list); + YYABORT; + } $$ = list; } @@ -463,29 +542,35 @@ tracepoint_name opt_event_config struct parse_events_state *parse_state = _parse_state; struct parse_events_error *error = parse_state->error; struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); if (error) error->idx = @1.first_column; - if (parse_events_add_tracepoint(list, &parse_state->idx, $1.sys, $1.event, - error, $2)) - return -1; + err = parse_events_add_tracepoint(list, &parse_state->idx, $1.sys, $1.event, + error, $2); + parse_events_terms__delete($2); + free($1.sys); + free($1.event); + if (err) { + free(list); + return -1; + } $$ = list; } tracepoint_name: PE_NAME '-' PE_NAME ':' PE_NAME { - char sys_name[128]; struct tracepoint_name tracepoint; - snprintf(&sys_name, 128, "%s-%s", $1, $3); - tracepoint.sys = &sys_name; + ABORT_ON(asprintf(&tracepoint.sys, "%s-%s", $1, $3) < 0); tracepoint.event = $5; - + free($1); + free($3); $$ = tracepoint; } | @@ -500,11 +585,16 @@ event_legacy_numeric: PE_VALUE ':' PE_VALUE opt_event_config { struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4)); + err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4); parse_events_terms__delete($4); + if (err) { + free(list); + YYABORT; + } $$ = list; } @@ -512,11 +602,16 @@ event_legacy_raw: PE_RAW opt_event_config { struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2)); + err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2); parse_events_terms__delete($2); + if (err) { + free(list); + YYABORT; + } $$ = list; } @@ -525,22 +620,33 @@ PE_BPF_OBJECT opt_event_config { struct parse_events_state *parse_state = _parse_state; struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_load_bpf(parse_state, list, $1, false, $2)); + err = parse_events_load_bpf(parse_state, list, $1, false, $2); parse_events_terms__delete($2); + free($1); + if (err) { + free(list); + YYABORT; + } $$ = list; } | PE_BPF_SOURCE opt_event_config { struct list_head *list; + int err; list = alloc_list(); ABORT_ON(!list); - ABORT_ON(parse_events_load_bpf(_parse_state, list, $1, true, $2)); + err = parse_events_load_bpf(_parse_state, list, $1, true, $2); parse_events_terms__delete($2); + if (err) { + free(list); + YYABORT; + } $$ = list; } @@ -573,6 +679,10 @@ opt_pmu_config: start_terms: event_config { struct parse_events_state *parse_state = _parse_state; + if (parse_state->terms) { + parse_events_terms__delete ($1); + YYABORT; + } parse_state->terms = $1; } @@ -582,7 +692,10 @@ event_config ',' event_term struct list_head *head = $1; struct parse_events_term *term = $3; - ABORT_ON(!head); + if (!head) { + free_term(term); + YYABORT; + } list_add_tail(&term->list, head); $$ = $1; } @@ -603,8 +716,12 @@ PE_NAME '=' PE_NAME { struct parse_events_term *term; - ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $3, &@1, &@3)); + if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1, $3, &@1, &@3)) { + free($1); + free($3); + YYABORT; + } $$ = term; } | @@ -612,8 +729,11 @@ PE_NAME '=' PE_VALUE { struct parse_events_term *term; - ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $3, false, &@1, &@3)); + if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1, $3, false, &@1, &@3)) { + free($1); + YYABORT; + } $$ = term; } | @@ -622,7 +742,10 @@ PE_NAME '=' PE_VALUE_SYM_HW struct parse_events_term *term; int config = $3 & 255; - ABORT_ON(parse_events_term__sym_hw(&term, $1, config)); + if (parse_events_term__sym_hw(&term, $1, config)) { + free($1); + YYABORT; + } $$ = term; } | @@ -630,8 +753,11 @@ PE_NAME { struct parse_events_term *term; - ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, 1, true, &@1, NULL)); + if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1, 1, true, &@1, NULL)) { + free($1); + YYABORT; + } $$ = term; } | @@ -648,7 +774,10 @@ PE_TERM '=' PE_NAME { struct parse_events_term *term; - ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3)); + if (parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3)) { + free($3); + YYABORT; + } $$ = term; } | @@ -672,9 +801,13 @@ PE_NAME array '=' PE_NAME { struct parse_events_term *term; - ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $4, &@1, &@4)); - + if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1, $4, &@1, &@4)) { + free($1); + free($4); + free($2.ranges); + YYABORT; + } term->array = $2; $$ = term; } @@ -683,8 +816,12 @@ PE_NAME array '=' PE_VALUE { struct parse_events_term *term; - ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $4, false, &@1, &@4)); + if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1, $4, false, &@1, &@4)) { + free($1); + free($2.ranges); + YYABORT; + } term->array = $2; $$ = term; } @@ -695,8 +832,11 @@ PE_DRV_CFG_TERM char *config = strdup($1); ABORT_ON(!config); - ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, - config, $1, &@1, NULL)); + if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, + config, $1, &@1, NULL)) { + free($1); + YYABORT; + } $$ = term; } From patchwork Wed Oct 23 00:53:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1181724 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="ACzNOSjh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46yX2g226Wz9sPh for ; Wed, 23 Oct 2019 11:54:35 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733240AbfJWAyc (ORCPT ); Tue, 22 Oct 2019 20:54:32 -0400 Received: from mail-pg1-f202.google.com ([209.85.215.202]:37858 "EHLO mail-pg1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733152AbfJWAyV (ORCPT ); Tue, 22 Oct 2019 20:54:21 -0400 Received: by mail-pg1-f202.google.com with SMTP id u20so9906077pga.4 for ; Tue, 22 Oct 2019 17:54:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=SBGZ2h3aJPS5SN0EQWSYu3r6PtBuafsgvwZrw927JEs=; b=ACzNOSjhSAZYiamU7+gIegPI+Q1tGEcVzOclcAta24FXA9bzre55G4jhXY4B3F/EOS QjXmegl3BtNi5CgWf0hg2RZOQ2b+hcfinMpmKHoXdCIjh5lbkoObioutFrR5TpzlGrOo GP6655uAvHe+yP1LlBKwQqzL0KsohokW/xV73/Wd/RGAtEXTl+a9YHAfpNU/Ne1cH8jc VwLRUe4ne6QB5+uskSqKMaTV7rNuhHDLUBhr+IIv4Ywo2id29V7e4aOQ4oR0Hky7wSD4 y0bFFjYGzE6UcfyibUpAfmWf4HWqy1hZoJL62SZ7mpwM5AHN6TflHqfk8y0ynM6upPMB 5HJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=SBGZ2h3aJPS5SN0EQWSYu3r6PtBuafsgvwZrw927JEs=; b=MXkH5DG9peHUa+8dIv0qCd7W7+gt1/TbpRIqIkWbYtyrvIg40GgiNJ+/YunS8BcYVu GAnxVUIkx4F/7FG5yC5+8nvKAzgo/puuEIHog5Ej1rHjBamHF6KNPRAeeTjD260G5pvd Q1SN4pnIKafUuZPaJ7XboC8Y8a2zwqgHXOg7a5FovBJ3PaU41/ew+tRs/GOybnPltTxd xR3ACW+mZiH4BNSSTk9Oq19jjrMovWaQ2P6hjeKoTpokbdxeolyOgQ/Hn4jXcZpOxdQX cSR3vLL2JgGnshsieKTqwXqbxROdR7iSJAI6CtLDX4iBD0aJ0q47HwuugWqrN5biC3wl umQQ== X-Gm-Message-State: APjAAAWU9WeLSC4CEPIjmAv/w8eRgh1F6rNaWC9/pL9KE03nPaq8fMmi +ssaFUgTzYRfpDsFbhILHUtl4Bq3s2f2 X-Google-Smtp-Source: APXvYqx2sTqLsUkmI521OZWxpQAAgcxz8e7uQh+AaUBQ+LvndCn6I2uaUNv4az8+K0JxYSw1RKpnpAIXu+7r X-Received: by 2002:a63:fa4a:: with SMTP id g10mr6658099pgk.432.1571792059764; Tue, 22 Oct 2019 17:54:19 -0700 (PDT) Date: Tue, 22 Oct 2019 17:53:36 -0700 In-Reply-To: <20191023005337.196160-1-irogers@google.com> Message-Id: <20191023005337.196160-9-irogers@google.com> Mime-Version: 1.0 References: <20191017170531.171244-1-irogers@google.com> <20191023005337.196160-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v2 8/9] perf tools: if pmu configuration fails free terms From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Avoid a memory leak when the configuration fails. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index f7c8d0853d71..6bf64b3767cc 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1400,8 +1400,15 @@ int parse_events_add_pmu(struct parse_events_state *parse_state, if (get_config_terms(head_config, &config_terms)) return -ENOMEM; - if (perf_pmu__config(pmu, &attr, head_config, parse_state->error)) + if (perf_pmu__config(pmu, &attr, head_config, parse_state->error)) { + struct perf_evsel_config_term *pos, *tmp; + + list_for_each_entry_safe(pos, tmp, &config_terms, list) { + list_del_init(&pos->list); + free(pos); + } return -EINVAL; + } evsel = __add_event(list, &parse_state->idx, &attr, get_config_name(head_config), pmu, From patchwork Wed Oct 23 00:53:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1181722 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="r0rbBPq3"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46yX2W35rtz9sPh for ; Wed, 23 Oct 2019 11:54:27 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733229AbfJWAy0 (ORCPT ); Tue, 22 Oct 2019 20:54:26 -0400 Received: from mail-pl1-f201.google.com ([209.85.214.201]:53485 "EHLO mail-pl1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733195AbfJWAyY (ORCPT ); Tue, 22 Oct 2019 20:54:24 -0400 Received: by mail-pl1-f201.google.com with SMTP id g13so11579083plq.20 for ; Tue, 22 Oct 2019 17:54:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=PC42O41NBd9i4kPitdETrfG1Za58EwGfR6rcMq8N6/A=; b=r0rbBPq3zpHRSh0k4CXUWN+PXGWGcH8Ra0xoXnRwQ8P1bprYbq8aMicMKIu2ImqIQ7 MDSSYQfeTaiJpLjTAUJQ2ipOGzsIVFRfx3VI0THolL1pXV6nqyOdO9WXwfSLRWnMkR70 6y2E0N1kF6/qWjyqDEO3U3vtpDMEpsv6xlO24q7JxIIyuHPdFm13QEO0jbYPDIvMLYZx 8FaE0eeXPISxOWkRiap7IQPhvErtd1lc1jTm/9quWMF2iFevLI5BjCvlRYsrOvI7P9Hc TFRxmQ7r64tZv0/Yh365ScvoWZK53o8xHze1Q5hlgbDcmgbMzAlCzWEUka8kqRLYU5tD 49CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=PC42O41NBd9i4kPitdETrfG1Za58EwGfR6rcMq8N6/A=; b=oE4xyga+opK9VS7U666nXgS4E1jDGJx0CUOu3MEHSEM0lY6pIeiAvLRg16jAL1LSwA Jt+ADQ3HU4wygdJuT2gEZQg4wmzs6jZ8AMOoP5GA3b7Z/Z4fIftz3tkpZAfZibxVZdRW mBcjT3I0opXkWWOVhcnVhN/eeE/JD6QFCqVw/2eDunC2O3BA0ZKSIxYmDQ6Sq3DCtotK Nu/uymL561tFB8IfsxxIDY7I+ZDa+YwIPTYR9Hpt28eOEeVgDUB9A++dUtkiVb/KZd0I LEoCSOFiF90KjHSkBdVUrgjMfPnyZvFL1po/jFvlk8bHxir0aaYLqc+Yzq/cWcdn3gE7 piUw== X-Gm-Message-State: APjAAAWeIaXvTDxwfMUFNOIh/8LTLfItS4IEGCoHbBrE9dSGis3kEn2P AYB26C3bepXPrXve/lHtlexkYfXcb/hX X-Google-Smtp-Source: APXvYqwVBqK65JMFO/1L3DV9WrvU2qA1aac/SY8ENQ2THYATWcqtOPLUbl+6/IfMrZt9xHPeGxFd/Q765iSO X-Received: by 2002:a63:1904:: with SMTP id z4mr6953016pgl.413.1571792062316; Tue, 22 Oct 2019 17:54:22 -0700 (PDT) Date: Tue, 22 Oct 2019 17:53:37 -0700 In-Reply-To: <20191023005337.196160-1-irogers@google.com> Message-Id: <20191023005337.196160-10-irogers@google.com> Mime-Version: 1.0 References: <20191017170531.171244-1-irogers@google.com> <20191023005337.196160-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v2 9/9] perf tools: add a deep delete for parse event terms From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add a parse_events_term deep delete function so that owned strings and arrays are freed. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.c | 16 +++++++++++++--- tools/perf/util/parse-events.h | 1 + tools/perf/util/parse-events.y | 12 ++---------- tools/perf/util/pmu.c | 2 +- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 6bf64b3767cc..5e7bebc8fad4 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -2806,6 +2806,18 @@ int parse_events_term__clone(struct parse_events_term **new, return new_term(new, &temp, strdup(term->val.str), 0); } +void parse_events_term__delete(struct parse_events_term *term) +{ + if (term->array.nr_ranges) + zfree(&term->array.ranges); + + if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM) + zfree(&term->val.str); + + zfree(&term->config); + free(term); +} + int parse_events_copy_term_list(struct list_head *old, struct list_head **new) { @@ -2836,10 +2848,8 @@ void parse_events_terms__purge(struct list_head *terms) struct parse_events_term *term, *h; list_for_each_entry_safe(term, h, terms, list) { - if (term->array.nr_ranges) - zfree(&term->array.ranges); list_del_init(&term->list); - free(term); + parse_events_term__delete(term); } } diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index a7d42faeab0c..d1ade97e2357 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -139,6 +139,7 @@ int parse_events_term__sym_hw(struct parse_events_term **term, char *config, unsigned idx); int parse_events_term__clone(struct parse_events_term **new, struct parse_events_term *term); +void parse_events_term__delete(struct parse_events_term *term); void parse_events_terms__delete(struct list_head *terms); void parse_events_terms__purge(struct list_head *terms); void parse_events__clear_array(struct parse_events_array *a); diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index d1cceb3bc620..649c63809bad 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -49,14 +49,6 @@ static void free_list_evsel(struct list_head* list_evsel) free(list_evsel); } -static void free_term(struct parse_events_term *term) -{ - if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) - free(term->val.str); - zfree(&term->array.ranges); - free(term); -} - static void inc_group_count(struct list_head *list, struct parse_events_state *parse_state) { @@ -99,7 +91,7 @@ static void inc_group_count(struct list_head *list, %type PE_DRV_CFG_TERM %destructor { free ($$); } %type event_term -%destructor { free_term ($$); } +%destructor { parse_events_term__delete ($$); } %type event_config %type opt_event_config %type opt_pmu_config @@ -693,7 +685,7 @@ event_config ',' event_term struct parse_events_term *term = $3; if (!head) { - free_term(term); + parse_events_term__delete(term); YYABORT; } list_add_tail(&term->list, head); diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 0fc2a51bb953..081e55300237 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1258,7 +1258,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms, info->metric_name = alias->metric_name; list_del_init(&term->list); - free(term); + parse_events_term__delete(term); } /*