2015-11-11 10:20:24

by Wang Nan

[permalink] [raw]
Subject: [PATCH] perf probe: Clear probe_trace_event when probe_trace_event failure

When failure occures in add_probe_trace_event(), to avoid potential
dangling pointer and memory leak, resource attached to 'struct
probe_trace_event' should be cleared.

Signed-off-by: Wang Nan <[email protected]>
Cc: Masami Hiramatsu <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Cc: Zefan Li <[email protected]>
Cc: [email protected]
---
tools/perf/util/probe-finder.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index bd8f03d..e9e37ca 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1235,6 +1235,8 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)

end:
free(args);
+ if (ret)
+ clear_probe_trace_event(tev);
return ret;
}

--
1.8.3.4


Subject: RE: [PATCH] perf probe: Clear probe_trace_event when probe_trace_event failure

From: Wang Nan [mailto:[email protected]]
>
>When failure occures in add_probe_trace_event(), to avoid potential
>dangling pointer and memory leak, resource attached to 'struct
>probe_trace_event' should be cleared.

Oops, right. I've found actual memory leak and this fix is not enough,
because debuginfo__find_trace_events() releases "tevs" array without
clearing everything in the array if it fails...

Since add_probe_trace_event() may be invoked repeatedly while searching
probe points from debuginfo, there can be the case that first N-1 times
succeeds, but Nth call fails. In that case, even if you clear the last
one, we still have N-1 tevs and debuginfo__find_trace_events() leaks those.
Thus, the correct fix is clearing all the tevs when we hit any error.

I'll send other patch to fix it.

Thanks!

>
>Signed-off-by: Wang Nan <[email protected]>
>Cc: Masami Hiramatsu <[email protected]>
>Cc: Arnaldo Carvalho de Melo <[email protected]>
>Cc: Zefan Li <[email protected]>
>Cc: [email protected]
>---
> tools/perf/util/probe-finder.c | 2 ++
> 1 file changed, 2 insertions(+)
>
>diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
>index bd8f03d..e9e37ca 100644
>--- a/tools/perf/util/probe-finder.c
>+++ b/tools/perf/util/probe-finder.c
>@@ -1235,6 +1235,8 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
>
> end:
> free(args);
>+ if (ret)
>+ clear_probe_trace_event(tev);
> return ret;
> }
>
>--
>1.8.3.4

????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?