summaryrefslogtreecommitdiffstats
path: root/src/addr2line.c
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2015-06-10 00:22:58 +0200
committerMark Wielaard <[email protected]>2015-06-10 14:14:57 +0200
commit5aa90b90adcce527ea3eb098990c809ab69cbf64 (patch)
tree89ebcc261730189b0d7657be68314b6afd8ec434 /src/addr2line.c
parentcb499c489299de2b77472fc836a6b28ecf5361b9 (diff)
addr2line: Fix memory leak in print_dwarf_function.
Always free the scopes returned by dwarf_getscopes () when done. Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'src/addr2line.c')
-rw-r--r--src/addr2line.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/addr2line.c b/src/addr2line.c
index 97f988ff..0ce854f6 100644
--- a/src/addr2line.c
+++ b/src/addr2line.c
@@ -330,6 +330,7 @@ print_dwarf_function (Dwfl_Module *mod, Dwarf_Addr addr)
if (nscopes <= 0)
return false;
+ bool res = false;
for (int i = 0; i < nscopes; ++i)
switch (dwarf_tag (&scopes[i]))
{
@@ -337,23 +338,25 @@ print_dwarf_function (Dwfl_Module *mod, Dwarf_Addr addr)
{
const char *name = get_diename (&scopes[i]);
if (name == NULL)
- return false;
+ goto done;
printf ("%s%c", symname (name), pretty ? ' ' : '\n');
- return true;
+ res = true;
+ goto done;
}
case DW_TAG_inlined_subroutine:
{
const char *name = get_diename (&scopes[i]);
if (name == NULL)
- return false;
+ goto done;
/* When using --pretty-print we only show inlines on their
own line. Just print the first subroutine name. */
if (pretty)
{
printf ("%s ", symname (name));
- return true;
+ res = true;
+ goto done;
}
else
printf ("%s inlined", symname (name));
@@ -414,7 +417,9 @@ print_dwarf_function (Dwfl_Module *mod, Dwarf_Addr addr)
}
}
- return false;
+done:
+ free (scopes);
+ return res;
}
static void