diff options
| author | Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> | 2010-08-02 22:11:40 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-08-06 15:25:56 -0400 |
| commit | 449e5b247ca7c9dc9fc3391b7eebfefdeb2ce1fc (patch) | |
| tree | 22d9aafb65a2f5d921e278d02292c3feb3392614 | |
| parent | 58432e1f3625ef22b347ec8f9487e1852aa9ad67 (diff) | |
perf probe: Fix memory leaks in add_perf_probe_events
Fix several memory leaks of pkgs and tevs in add_perf_probe_events().
Reported-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: linux-kernel@vger.kernel.org
LKML-Reference: <4C577ADC.1000309@hitachi.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
| -rw-r--r-- | tools/perf/util/probe-event.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 2e665cb84055..e72f05c3bef0 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
| @@ -1606,8 +1606,10 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, | |||
| 1606 | 1606 | ||
| 1607 | /* Init vmlinux path */ | 1607 | /* Init vmlinux path */ |
| 1608 | ret = init_vmlinux(); | 1608 | ret = init_vmlinux(); |
| 1609 | if (ret < 0) | 1609 | if (ret < 0) { |
| 1610 | free(pkgs); | ||
| 1610 | return ret; | 1611 | return ret; |
| 1612 | } | ||
| 1611 | 1613 | ||
| 1612 | /* Loop 1: convert all events */ | 1614 | /* Loop 1: convert all events */ |
| 1613 | for (i = 0; i < npevs; i++) { | 1615 | for (i = 0; i < npevs; i++) { |
| @@ -1625,10 +1627,13 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, | |||
| 1625 | ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, | 1627 | ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, |
| 1626 | pkgs[i].ntevs, force_add); | 1628 | pkgs[i].ntevs, force_add); |
| 1627 | end: | 1629 | end: |
| 1628 | /* Loop 3: cleanup trace events */ | 1630 | /* Loop 3: cleanup and free trace events */ |
| 1629 | for (i = 0; i < npevs; i++) | 1631 | for (i = 0; i < npevs; i++) { |
| 1630 | for (j = 0; j < pkgs[i].ntevs; j++) | 1632 | for (j = 0; j < pkgs[i].ntevs; j++) |
| 1631 | clear_probe_trace_event(&pkgs[i].tevs[j]); | 1633 | clear_probe_trace_event(&pkgs[i].tevs[j]); |
| 1634 | free(pkgs[i].tevs); | ||
| 1635 | } | ||
| 1636 | free(pkgs); | ||
| 1632 | 1637 | ||
| 1633 | return ret; | 1638 | return ret; |
| 1634 | } | 1639 | } |
