Messages in this thread Patch in this message | | | From | Adrian Hunter <> | Subject | [PATCH V2 06/15] perf tools: fix parse_events_terms() freeing local variable on error path | Date | Thu, 27 Jun 2013 10:54:58 +0300 |
| |
The list_head is on the stack, so just free the rest of the list.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> --- tools/perf/util/parse-events.c | 7 ++++++- tools/perf/util/parse-events.h | 1 + tools/perf/util/pmu.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 995fc25..d9cb055 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1231,12 +1231,17 @@ int parse_events_term__clone(struct parse_events_term **new, term->val.str, term->val.num); } -void parse_events__free_terms(struct list_head *terms) +void parse_events__free_terms_only(struct list_head *terms) { struct parse_events_term *term, *h; list_for_each_entry_safe(term, h, terms, list) free(term); +} + +void parse_events__free_terms(struct list_head *terms) +{ + parse_events__free_terms_only(terms); free(terms); } diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 8a48593..6cb6f32 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -80,6 +80,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__free_terms_only(struct list_head *terms); void parse_events__free_terms(struct list_head *terms); int parse_events__modifier_event(struct list_head *list, char *str, bool add); int parse_events__modifier_group(struct list_head *list, char *event_mod); diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 4c6f9c4..5dd9e37 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -194,7 +194,7 @@ static int pmu_alias_terms(struct perf_pmu_alias *alias, list_for_each_entry(term, &alias->terms, list) { ret = parse_events_term__clone(&clone, term); if (ret) { - parse_events__free_terms(&list); + parse_events__free_terms_only(&list); return ret; } list_add_tail(&clone->list, &list); -- 1.7.11.7
| |