aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/parse-events.c
diff options
context:
space:
mode:
authorTaeung Song <treeze.taeung@gmail.com>2017-02-01 07:34:07 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-02-08 07:41:12 -0500
commit360e071b1822d40357e371357f24f6ec43f0a080 (patch)
tree0e02ef69ade6c9e2ebe082ef05afdf25ea6b5736 /tools/perf/util/parse-events.c
parent506fde11a35f39e1b44478339c41e94dfd278aa2 (diff)
perf tools: Use zfree() to avoid keeping dangling pointers
The cases changed in this patch are for when we free but keep the pointer to the freed area, which is not always a good idea. Be more defensive and zero the pointer to avoid possible use after free bugs to take more time to be detected. Signed-off-by: Taeung Song <treeze.taeung@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/r/1485952447-7013-5-git-send-email-treeze.taeung@gmail.com [ rewrote commit log ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/parse-events.c')
-rw-r--r--tools/perf/util/parse-events.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index ab1ba22d879a..07be0762e53e 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1479,7 +1479,7 @@ static void perf_pmu__parse_cleanup(void)
1479 1479
1480 for (i = 0; i < perf_pmu_events_list_num; i++) { 1480 for (i = 0; i < perf_pmu_events_list_num; i++) {
1481 p = perf_pmu_events_list + i; 1481 p = perf_pmu_events_list + i;
1482 free(p->symbol); 1482 zfree(&p->symbol);
1483 } 1483 }
1484 zfree(&perf_pmu_events_list); 1484 zfree(&perf_pmu_events_list);
1485 perf_pmu_events_list_num = 0; 1485 perf_pmu_events_list_num = 0;
@@ -1570,7 +1570,7 @@ perf_pmu__parse_check(const char *name)
1570 r = bsearch(&p, perf_pmu_events_list, 1570 r = bsearch(&p, perf_pmu_events_list,
1571 (size_t) perf_pmu_events_list_num, 1571 (size_t) perf_pmu_events_list_num,
1572 sizeof(struct perf_pmu_event_symbol), comp_pmu); 1572 sizeof(struct perf_pmu_event_symbol), comp_pmu);
1573 free(p.symbol); 1573 zfree(&p.symbol);
1574 return r ? r->type : PMU_EVENT_SYMBOL_ERR; 1574 return r ? r->type : PMU_EVENT_SYMBOL_ERR;
1575} 1575}
1576 1576
@@ -1717,8 +1717,8 @@ static void parse_events_print_error(struct parse_events_error *err,
1717 fprintf(stderr, "%*s\\___ %s\n", idx + 1, "", err->str); 1717 fprintf(stderr, "%*s\\___ %s\n", idx + 1, "", err->str);
1718 if (err->help) 1718 if (err->help)
1719 fprintf(stderr, "\n%s\n", err->help); 1719 fprintf(stderr, "\n%s\n", err->help);
1720 free(err->str); 1720 zfree(&err->str);
1721 free(err->help); 1721 zfree(&err->help);
1722 } 1722 }
1723 1723
1724 fprintf(stderr, "Run 'perf list' for a list of valid events\n"); 1724 fprintf(stderr, "Run 'perf list' for a list of valid events\n");
@@ -2413,7 +2413,7 @@ void parse_events_terms__purge(struct list_head *terms)
2413 2413
2414 list_for_each_entry_safe(term, h, terms, list) { 2414 list_for_each_entry_safe(term, h, terms, list) {
2415 if (term->array.nr_ranges) 2415 if (term->array.nr_ranges)
2416 free(term->array.ranges); 2416 zfree(&term->array.ranges);
2417 list_del_init(&term->list); 2417 list_del_init(&term->list);
2418 free(term); 2418 free(term);
2419 } 2419 }
@@ -2429,7 +2429,7 @@ void parse_events_terms__delete(struct list_head *terms)
2429 2429
2430void parse_events__clear_array(struct parse_events_array *a) 2430void parse_events__clear_array(struct parse_events_array *a)
2431{ 2431{
2432 free(a->ranges); 2432 zfree(&a->ranges);
2433} 2433}
2434 2434
2435void parse_events_evlist_error(struct parse_events_evlist *data, 2435void parse_events_evlist_error(struct parse_events_evlist *data,