aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2013-12-27 14:55:14 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2013-12-27 15:08:19 -0500
commit74cf249d5cf7de84c88cca69a2f13b13d500ff94 (patch)
treefc61aabd22d981e95fe6ffe9a839e07bbb1f95a0 /tools/perf/util
parent046625231a0397f1776eb353a4ec9ff142cd2f6b (diff)
perf tools: Use zfree to help detect use after free bugs
Several areas already used this technique, so do some audit to consistently use it elsewhere. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-9sbere0kkplwe45ak6rk4a1f@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util')
-rw-r--r--tools/perf/util/annotate.c20
-rw-r--r--tools/perf/util/cgroup.c2
-rw-r--r--tools/perf/util/comm.c2
-rw-r--r--tools/perf/util/evsel.c8
-rw-r--r--tools/perf/util/header.c10
-rw-r--r--tools/perf/util/help.c4
-rw-r--r--tools/perf/util/hist.c6
-rw-r--r--tools/perf/util/parse-events.c8
-rw-r--r--tools/perf/util/pmu.c2
-rw-r--r--tools/perf/util/probe-event.c8
-rw-r--r--tools/perf/util/probe-finder.c2
-rw-r--r--tools/perf/util/session.c24
-rw-r--r--tools/perf/util/srcline.c6
-rw-r--r--tools/perf/util/strbuf.c2
-rw-r--r--tools/perf/util/strfilter.c2
-rw-r--r--tools/perf/util/string.c2
-rw-r--r--tools/perf/util/strlist.c3
-rw-r--r--tools/perf/util/svghelper.c5
-rw-r--r--tools/perf/util/symbol-elf.c2
-rw-r--r--tools/perf/util/symbol-minimal.c3
-rw-r--r--tools/perf/util/symbol.c2
-rw-r--r--tools/perf/util/thread_map.c10
-rw-r--r--tools/perf/util/trace-event-info.c4
-rw-r--r--tools/perf/util/values.c14
24 files changed, 77 insertions, 74 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index a78721d14694..469eb679fb9d 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -26,10 +26,10 @@ static int disasm_line__parse(char *line, char **namep, char **rawp);
26 26
27static void ins__delete(struct ins_operands *ops) 27static void ins__delete(struct ins_operands *ops)
28{ 28{
29 free(ops->source.raw); 29 zfree(&ops->source.raw);
30 free(ops->source.name); 30 zfree(&ops->source.name);
31 free(ops->target.raw); 31 zfree(&ops->target.raw);
32 free(ops->target.name); 32 zfree(&ops->target.name);
33} 33}
34 34
35static int ins__raw_scnprintf(struct ins *ins, char *bf, size_t size, 35static int ins__raw_scnprintf(struct ins *ins, char *bf, size_t size,
@@ -204,9 +204,9 @@ static int lock__scnprintf(struct ins *ins, char *bf, size_t size,
204 204
205static void lock__delete(struct ins_operands *ops) 205static void lock__delete(struct ins_operands *ops)
206{ 206{
207 free(ops->locked.ops); 207 zfree(&ops->locked.ops);
208 free(ops->target.raw); 208 zfree(&ops->target.raw);
209 free(ops->target.name); 209 zfree(&ops->target.name);
210} 210}
211 211
212static struct ins_ops lock_ops = { 212static struct ins_ops lock_ops = {
@@ -583,7 +583,7 @@ static struct disasm_line *disasm_line__new(s64 offset, char *line, size_t privs
583 return dl; 583 return dl;
584 584
585out_free_line: 585out_free_line:
586 free(dl->line); 586 zfree(&dl->line);
587out_delete: 587out_delete:
588 free(dl); 588 free(dl);
589 return NULL; 589 return NULL;
@@ -591,8 +591,8 @@ out_delete:
591 591
592void disasm_line__free(struct disasm_line *dl) 592void disasm_line__free(struct disasm_line *dl)
593{ 593{
594 free(dl->line); 594 zfree(&dl->line);
595 free(dl->name); 595 zfree(&dl->name);
596 if (dl->ins && dl->ins->ops->free) 596 if (dl->ins && dl->ins->ops->free)
597 dl->ins->ops->free(&dl->ops); 597 dl->ins->ops->free(&dl->ops);
598 else 598 else
diff --git a/tools/perf/util/cgroup.c b/tools/perf/util/cgroup.c
index 96bbda1ddb83..0922aa4218c2 100644
--- a/tools/perf/util/cgroup.c
+++ b/tools/perf/util/cgroup.c
@@ -133,7 +133,7 @@ void close_cgroup(struct cgroup_sel *cgrp)
133 /* XXX: not reentrant */ 133 /* XXX: not reentrant */
134 if (--cgrp->refcnt == 0) { 134 if (--cgrp->refcnt == 0) {
135 close(cgrp->fd); 135 close(cgrp->fd);
136 free(cgrp->name); 136 zfree(&cgrp->name);
137 free(cgrp); 137 free(cgrp);
138 } 138 }
139} 139}
diff --git a/tools/perf/util/comm.c b/tools/perf/util/comm.c
index ee0df0e24cdb..67d1e404c0cb 100644
--- a/tools/perf/util/comm.c
+++ b/tools/perf/util/comm.c
@@ -21,7 +21,7 @@ static void comm_str__put(struct comm_str *cs)
21{ 21{
22 if (!--cs->ref) { 22 if (!--cs->ref) {
23 rb_erase(&cs->rb_node, &comm_str_root); 23 rb_erase(&cs->rb_node, &comm_str_root);
24 free(cs->str); 24 zfree(&cs->str);
25 free(cs); 25 free(cs);
26 } 26 }
27} 27}
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 93b6031d5459..ade8d9c1c431 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -208,7 +208,7 @@ struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int
208 return evsel; 208 return evsel;
209 209
210out_free: 210out_free:
211 free(evsel->name); 211 zfree(&evsel->name);
212 free(evsel); 212 free(evsel);
213 return NULL; 213 return NULL;
214} 214}
@@ -766,7 +766,7 @@ void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads)
766 766
767void perf_evsel__free_counts(struct perf_evsel *evsel) 767void perf_evsel__free_counts(struct perf_evsel *evsel)
768{ 768{
769 free(evsel->counts); 769 zfree(&evsel->counts);
770} 770}
771 771
772void perf_evsel__exit(struct perf_evsel *evsel) 772void perf_evsel__exit(struct perf_evsel *evsel)
@@ -780,10 +780,10 @@ void perf_evsel__delete(struct perf_evsel *evsel)
780{ 780{
781 perf_evsel__exit(evsel); 781 perf_evsel__exit(evsel);
782 close_cgroup(evsel->cgrp); 782 close_cgroup(evsel->cgrp);
783 free(evsel->group_name); 783 zfree(&evsel->group_name);
784 if (evsel->tp_format) 784 if (evsel->tp_format)
785 pevent_free_format(evsel->tp_format); 785 pevent_free_format(evsel->tp_format);
786 free(evsel->name); 786 zfree(&evsel->name);
787 free(evsel); 787 free(evsel);
788} 788}
789 789
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 20f3a9c97bd8..a4a60b7887ee 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -800,10 +800,10 @@ static void free_cpu_topo(struct cpu_topo *tp)
800 return; 800 return;
801 801
802 for (i = 0 ; i < tp->core_sib; i++) 802 for (i = 0 ; i < tp->core_sib; i++)
803 free(tp->core_siblings[i]); 803 zfree(&tp->core_siblings[i]);
804 804
805 for (i = 0 ; i < tp->thread_sib; i++) 805 for (i = 0 ; i < tp->thread_sib; i++)
806 free(tp->thread_siblings[i]); 806 zfree(&tp->thread_siblings[i]);
807 807
808 free(tp); 808 free(tp);
809} 809}
@@ -1232,8 +1232,8 @@ static void free_event_desc(struct perf_evsel *events)
1232 return; 1232 return;
1233 1233
1234 for (evsel = events; evsel->attr.size; evsel++) { 1234 for (evsel = events; evsel->attr.size; evsel++) {
1235 free(evsel->name); 1235 zfree(&evsel->name);
1236 free(evsel->id); 1236 zfree(&evsel->id);
1237 } 1237 }
1238 1238
1239 free(events); 1239 free(events);
@@ -2105,7 +2105,7 @@ static int process_group_desc(struct perf_file_section *section __maybe_unused,
2105 ret = 0; 2105 ret = 0;
2106out_free: 2106out_free:
2107 for (i = 0; i < nr_groups; i++) 2107 for (i = 0; i < nr_groups; i++)
2108 free(desc[i].name); 2108 zfree(&desc[i].name);
2109 free(desc); 2109 free(desc);
2110 2110
2111 return ret; 2111 return ret;
diff --git a/tools/perf/util/help.c b/tools/perf/util/help.c
index 7b68978e50d2..86c37c472263 100644
--- a/tools/perf/util/help.c
+++ b/tools/perf/util/help.c
@@ -22,8 +22,8 @@ static void clean_cmdnames(struct cmdnames *cmds)
22 unsigned int i; 22 unsigned int i;
23 23
24 for (i = 0; i < cmds->cnt; ++i) 24 for (i = 0; i < cmds->cnt; ++i)
25 free(cmds->names[i]); 25 zfree(&cmds->names[i]);
26 free(cmds->names); 26 zfree(&cmds->names);
27 cmds->cnt = 0; 27 cmds->cnt = 0;
28 cmds->alloc = 0; 28 cmds->alloc = 0;
29} 29}
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 6cd4823a7a8b..4ed3e883240d 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -372,7 +372,7 @@ static struct hist_entry *add_hist_entry(struct hists *hists,
372 * This mem info was allocated from machine__resolve_mem 372 * This mem info was allocated from machine__resolve_mem
373 * and will not be used anymore. 373 * and will not be used anymore.
374 */ 374 */
375 free(entry->mem_info); 375 zfree(&entry->mem_info);
376 376
377 /* If the map of an existing hist_entry has 377 /* If the map of an existing hist_entry has
378 * become out-of-date due to an exec() or 378 * become out-of-date due to an exec() or
@@ -475,8 +475,8 @@ hist_entry__collapse(struct hist_entry *left, struct hist_entry *right)
475 475
476void hist_entry__free(struct hist_entry *he) 476void hist_entry__free(struct hist_entry *he)
477{ 477{
478 free(he->branch_info); 478 zfree(&he->branch_info);
479 free(he->mem_info); 479 zfree(&he->mem_info);
480 free_srcline(he->srcline); 480 free_srcline(he->srcline);
481 free(he); 481 free(he);
482} 482}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 094c28ba2fae..0153435b8427 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -204,7 +204,7 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config)
204 } 204 }
205 path->name = malloc(MAX_EVENT_LENGTH); 205 path->name = malloc(MAX_EVENT_LENGTH);
206 if (!path->name) { 206 if (!path->name) {
207 free(path->system); 207 zfree(&path->system);
208 free(path); 208 free(path);
209 return NULL; 209 return NULL;
210 } 210 }
@@ -236,8 +236,8 @@ struct tracepoint_path *tracepoint_name_to_path(const char *name)
236 path->name = strdup(str+1); 236 path->name = strdup(str+1);
237 237
238 if (path->system == NULL || path->name == NULL) { 238 if (path->system == NULL || path->name == NULL) {
239 free(path->system); 239 zfree(&path->system);
240 free(path->name); 240 zfree(&path->name);
241 free(path); 241 free(path);
242 path = NULL; 242 path = NULL;
243 } 243 }
@@ -917,7 +917,7 @@ int parse_events_terms(struct list_head *terms, const char *str)
917 ret = parse_events__scanner(str, &data, PE_START_TERMS); 917 ret = parse_events__scanner(str, &data, PE_START_TERMS);
918 if (!ret) { 918 if (!ret) {
919 list_splice(data.terms, terms); 919 list_splice(data.terms, terms);
920 free(data.terms); 920 zfree(&data.terms);
921 return 0; 921 return 0;
922 } 922 }
923 923
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 56fc10a5e288..0934d645ebdc 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -755,7 +755,7 @@ void print_pmu_events(const char *event_glob, bool name_only)
755 continue; 755 continue;
756 } 756 }
757 printf(" %-50s [Kernel PMU event]\n", aliases[j]); 757 printf(" %-50s [Kernel PMU event]\n", aliases[j]);
758 free(aliases[j]); 758 zfree(&aliases[j]);
759 printed++; 759 printed++;
760 } 760 }
761 if (printed) 761 if (printed)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 4d3cd1a0278a..86ed8580c3cb 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -356,7 +356,7 @@ static int add_exec_to_probe_trace_events(struct probe_trace_event *tevs,
356 offset = tevs[i].point.address - stext; 356 offset = tevs[i].point.address - stext;
357 offset += tevs[i].point.offset; 357 offset += tevs[i].point.offset;
358 tevs[i].point.offset = 0; 358 tevs[i].point.offset = 0;
359 free(tevs[i].point.symbol); 359 zfree(&tevs[i].point.symbol);
360 ret = e_snprintf(buf, 32, "0x%lx", offset); 360 ret = e_snprintf(buf, 32, "0x%lx", offset);
361 if (ret < 0) 361 if (ret < 0)
362 break; 362 break;
@@ -683,7 +683,7 @@ static int show_available_vars_at(struct debuginfo *dinfo,
683 */ 683 */
684 fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol, 684 fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol,
685 vl->point.offset); 685 vl->point.offset);
686 free(vl->point.symbol); 686 zfree(&vl->point.symbol);
687 nvars = 0; 687 nvars = 0;
688 if (vl->vars) { 688 if (vl->vars) {
689 strlist__for_each(node, vl->vars) { 689 strlist__for_each(node, vl->vars) {
@@ -1592,7 +1592,7 @@ void clear_perf_probe_event(struct perf_probe_event *pev)
1592 field = pev->args[i].field; 1592 field = pev->args[i].field;
1593 while (field) { 1593 while (field) {
1594 next = field->next; 1594 next = field->next;
1595 free(field->name); 1595 zfree(&field->name);
1596 free(field); 1596 free(field);
1597 field = next; 1597 field = next;
1598 } 1598 }
@@ -2153,7 +2153,7 @@ end:
2153 for (i = 0; i < npevs; i++) { 2153 for (i = 0; i < npevs; i++) {
2154 for (j = 0; j < pkgs[i].ntevs; j++) 2154 for (j = 0; j < pkgs[i].ntevs; j++)
2155 clear_probe_trace_event(&pkgs[i].tevs[j]); 2155 clear_probe_trace_event(&pkgs[i].tevs[j]);
2156 free(pkgs[i].tevs); 2156 zfree(&pkgs[i].tevs);
2157 } 2157 }
2158 free(pkgs); 2158 free(pkgs);
2159 2159
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 6d8796e38d7f..061edb162b5b 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1409,7 +1409,7 @@ int debuginfo__find_available_vars_at(struct debuginfo *dbg,
1409 if (ret < 0) { 1409 if (ret < 0) {
1410 /* Free vlist for error */ 1410 /* Free vlist for error */
1411 while (af.nvls--) { 1411 while (af.nvls--) {
1412 free(af.vls[af.nvls].point.symbol); 1412 zfree(&af.vls[af.nvls].point.symbol);
1413 strlist__delete(af.vls[af.nvls].vars); 1413 strlist__delete(af.vls[af.nvls].vars);
1414 } 1414 }
1415 zfree(vls); 1415 zfree(vls);
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index d3a857be9682..8ffe29c55d0f 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -132,18 +132,18 @@ static void perf_session__delete_threads(struct perf_session *session)
132 132
133static void perf_session_env__delete(struct perf_session_env *env) 133static void perf_session_env__delete(struct perf_session_env *env)
134{ 134{
135 free(env->hostname); 135 zfree(&env->hostname);
136 free(env->os_release); 136 zfree(&env->os_release);
137 free(env->version); 137 zfree(&env->version);
138 free(env->arch); 138 zfree(&env->arch);
139 free(env->cpu_desc); 139 zfree(&env->cpu_desc);
140 free(env->cpuid); 140 zfree(&env->cpuid);
141 141
142 free(env->cmdline); 142 zfree(&env->cmdline);
143 free(env->sibling_cores); 143 zfree(&env->sibling_cores);
144 free(env->sibling_threads); 144 zfree(&env->sibling_threads);
145 free(env->numa_nodes); 145 zfree(&env->numa_nodes);
146 free(env->pmu_mappings); 146 zfree(&env->pmu_mappings);
147} 147}
148 148
149void perf_session__delete(struct perf_session *session) 149void perf_session__delete(struct perf_session *session)
diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c
index 58b2bd8f38c9..7e67879ebd25 100644
--- a/tools/perf/util/srcline.c
+++ b/tools/perf/util/srcline.c
@@ -129,7 +129,7 @@ static struct a2l_data *addr2line_init(const char *path)
129 129
130out: 130out:
131 if (a2l) { 131 if (a2l) {
132 free((void *)a2l->input); 132 zfree((void **)&a2l->input);
133 free(a2l); 133 free(a2l);
134 } 134 }
135 bfd_close(abfd); 135 bfd_close(abfd);
@@ -140,8 +140,8 @@ static void addr2line_cleanup(struct a2l_data *a2l)
140{ 140{
141 if (a2l->abfd) 141 if (a2l->abfd)
142 bfd_close(a2l->abfd); 142 bfd_close(a2l->abfd);
143 free((void *)a2l->input); 143 zfree((void **)&a2l->input);
144 free(a2l->syms); 144 zfree(&a2l->syms);
145 free(a2l); 145 free(a2l);
146} 146}
147 147
diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c
index cfa906882e2c..4abe23550c73 100644
--- a/tools/perf/util/strbuf.c
+++ b/tools/perf/util/strbuf.c
@@ -28,7 +28,7 @@ void strbuf_init(struct strbuf *sb, ssize_t hint)
28void strbuf_release(struct strbuf *sb) 28void strbuf_release(struct strbuf *sb)
29{ 29{
30 if (sb->alloc) { 30 if (sb->alloc) {
31 free(sb->buf); 31 zfree(&sb->buf);
32 strbuf_init(sb, 0); 32 strbuf_init(sb, 0);
33 } 33 }
34} 34}
diff --git a/tools/perf/util/strfilter.c b/tools/perf/util/strfilter.c
index 3edd0538161f..79a757a2a15c 100644
--- a/tools/perf/util/strfilter.c
+++ b/tools/perf/util/strfilter.c
@@ -14,7 +14,7 @@ static void strfilter_node__delete(struct strfilter_node *node)
14{ 14{
15 if (node) { 15 if (node) {
16 if (node->p && !is_operator(*node->p)) 16 if (node->p && !is_operator(*node->p))
17 free((char *)node->p); 17 zfree((char **)&node->p);
18 strfilter_node__delete(node->l); 18 strfilter_node__delete(node->l);
19 strfilter_node__delete(node->r); 19 strfilter_node__delete(node->r);
20 free(node); 20 free(node);
diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c
index f0b0c008c507..2553e5b55b89 100644
--- a/tools/perf/util/string.c
+++ b/tools/perf/util/string.c
@@ -128,7 +128,7 @@ void argv_free(char **argv)
128{ 128{
129 char **p; 129 char **p;
130 for (p = argv; *p; p++) 130 for (p = argv; *p; p++)
131 free(*p); 131 zfree(p);
132 132
133 free(argv); 133 free(argv);
134} 134}
diff --git a/tools/perf/util/strlist.c b/tools/perf/util/strlist.c
index eabdce0a2daa..61a90bf24b4d 100644
--- a/tools/perf/util/strlist.c
+++ b/tools/perf/util/strlist.c
@@ -5,6 +5,7 @@
5 */ 5 */
6 6
7#include "strlist.h" 7#include "strlist.h"
8#include "util.h"
8#include <errno.h> 9#include <errno.h>
9#include <stdio.h> 10#include <stdio.h>
10#include <stdlib.h> 11#include <stdlib.h>
@@ -38,7 +39,7 @@ out_delete:
38static void str_node__delete(struct str_node *snode, bool dupstr) 39static void str_node__delete(struct str_node *snode, bool dupstr)
39{ 40{
40 if (dupstr) 41 if (dupstr)
41 free((void *)snode->s); 42 zfree((void **)&snode->s);
42 free(snode); 43 free(snode);
43} 44}
44 45
diff --git a/tools/perf/util/svghelper.c b/tools/perf/util/svghelper.c
index 56a84f2cc46d..43262b83c541 100644
--- a/tools/perf/util/svghelper.c
+++ b/tools/perf/util/svghelper.c
@@ -21,6 +21,7 @@
21 21
22#include "perf.h" 22#include "perf.h"
23#include "svghelper.h" 23#include "svghelper.h"
24#include "util.h"
24#include "cpumap.h" 25#include "cpumap.h"
25 26
26static u64 first_time, last_time; 27static u64 first_time, last_time;
@@ -708,8 +709,8 @@ int svg_build_topology_map(char *sib_core, int sib_core_nr,
708 return 0; 709 return 0;
709 710
710exit: 711exit:
711 free(t.sib_core); 712 zfree(&t.sib_core);
712 free(t.sib_thr); 713 zfree(&t.sib_thr);
713 714
714 return -1; 715 return -1;
715} 716}
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index bf0ce29567b6..4b0a127a4d3b 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -554,7 +554,7 @@ bool symsrc__has_symtab(struct symsrc *ss)
554 554
555void symsrc__destroy(struct symsrc *ss) 555void symsrc__destroy(struct symsrc *ss)
556{ 556{
557 free(ss->name); 557 zfree(&ss->name);
558 elf_end(ss->elf); 558 elf_end(ss->elf);
559 close(ss->fd); 559 close(ss->fd);
560} 560}
diff --git a/tools/perf/util/symbol-minimal.c b/tools/perf/util/symbol-minimal.c
index ac7070a2f2b6..bd15f490d04f 100644
--- a/tools/perf/util/symbol-minimal.c
+++ b/tools/perf/util/symbol-minimal.c
@@ -1,4 +1,5 @@
1#include "symbol.h" 1#include "symbol.h"
2#include "util.h"
2 3
3#include <stdio.h> 4#include <stdio.h>
4#include <fcntl.h> 5#include <fcntl.h>
@@ -275,7 +276,7 @@ bool symsrc__has_symtab(struct symsrc *ss __maybe_unused)
275 276
276void symsrc__destroy(struct symsrc *ss) 277void symsrc__destroy(struct symsrc *ss)
277{ 278{
278 free(ss->name); 279 zfree(&ss->name);
279 close(ss->fd); 280 close(ss->fd);
280} 281}
281 282
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index fd9e1a4fad16..39ce9adbaaf0 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -796,7 +796,7 @@ static void delete_modules(struct rb_root *modules)
796 mi = rb_entry(next, struct module_info, rb_node); 796 mi = rb_entry(next, struct module_info, rb_node);
797 next = rb_next(&mi->rb_node); 797 next = rb_next(&mi->rb_node);
798 rb_erase(&mi->rb_node, modules); 798 rb_erase(&mi->rb_node, modules);
799 free(mi->name); 799 zfree(&mi->name);
800 free(mi); 800 free(mi);
801 } 801 }
802} 802}
diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c
index cf44644a4058..5d3215912105 100644
--- a/tools/perf/util/thread_map.c
+++ b/tools/perf/util/thread_map.c
@@ -41,7 +41,7 @@ struct thread_map *thread_map__new_by_pid(pid_t pid)
41 } 41 }
42 42
43 for (i=0; i<items; i++) 43 for (i=0; i<items; i++)
44 free(namelist[i]); 44 zfree(&namelist[i]);
45 free(namelist); 45 free(namelist);
46 46
47 return threads; 47 return threads;
@@ -118,7 +118,7 @@ struct thread_map *thread_map__new_by_uid(uid_t uid)
118 threads->map[threads->nr + i] = atoi(namelist[i]->d_name); 118 threads->map[threads->nr + i] = atoi(namelist[i]->d_name);
119 119
120 for (i = 0; i < items; i++) 120 for (i = 0; i < items; i++)
121 free(namelist[i]); 121 zfree(&namelist[i]);
122 free(namelist); 122 free(namelist);
123 123
124 threads->nr += items; 124 threads->nr += items;
@@ -135,7 +135,7 @@ out_free_threads:
135 135
136out_free_namelist: 136out_free_namelist:
137 for (i = 0; i < items; i++) 137 for (i = 0; i < items; i++)
138 free(namelist[i]); 138 zfree(&namelist[i]);
139 free(namelist); 139 free(namelist);
140 140
141out_free_closedir: 141out_free_closedir:
@@ -194,7 +194,7 @@ static struct thread_map *thread_map__new_by_pid_str(const char *pid_str)
194 194
195 for (i = 0; i < items; i++) { 195 for (i = 0; i < items; i++) {
196 threads->map[j++] = atoi(namelist[i]->d_name); 196 threads->map[j++] = atoi(namelist[i]->d_name);
197 free(namelist[i]); 197 zfree(&namelist[i]);
198 } 198 }
199 threads->nr = total_tasks; 199 threads->nr = total_tasks;
200 free(namelist); 200 free(namelist);
@@ -206,7 +206,7 @@ out:
206 206
207out_free_namelist: 207out_free_namelist:
208 for (i = 0; i < items; i++) 208 for (i = 0; i < items; i++)
209 free(namelist[i]); 209 zfree(&namelist[i]);
210 free(namelist); 210 free(namelist);
211 211
212out_free_threads: 212out_free_threads:
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index 9f73bf43862c..7e6fcfe8b438 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -397,8 +397,8 @@ put_tracepoints_path(struct tracepoint_path *tps)
397 struct tracepoint_path *t = tps; 397 struct tracepoint_path *t = tps;
398 398
399 tps = tps->next; 399 tps = tps->next;
400 free(t->name); 400 zfree(&t->name);
401 free(t->system); 401 zfree(&t->system);
402 free(t); 402 free(t);
403 } 403 }
404} 404}
diff --git a/tools/perf/util/values.c b/tools/perf/util/values.c
index 697c8b4e59cc..0fb3c1fcd3e6 100644
--- a/tools/perf/util/values.c
+++ b/tools/perf/util/values.c
@@ -31,14 +31,14 @@ void perf_read_values_destroy(struct perf_read_values *values)
31 return; 31 return;
32 32
33 for (i = 0; i < values->threads; i++) 33 for (i = 0; i < values->threads; i++)
34 free(values->value[i]); 34 zfree(&values->value[i]);
35 free(values->value); 35 zfree(&values->value);
36 free(values->pid); 36 zfree(&values->pid);
37 free(values->tid); 37 zfree(&values->tid);
38 free(values->counterrawid); 38 zfree(&values->counterrawid);
39 for (i = 0; i < values->counters; i++) 39 for (i = 0; i < values->counters; i++)
40 free(values->countername[i]); 40 zfree(&values->countername[i]);
41 free(values->countername); 41 zfree(&values->countername);
42} 42}
43 43
44static void perf_read_values__enlarge_threads(struct perf_read_values *values) 44static void perf_read_values__enlarge_threads(struct perf_read_values *values)