diff options
| author | Mark Wielaard <[email protected]> | 2015-06-10 00:22:58 +0200 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2015-06-10 14:14:57 +0200 |
| commit | 5aa90b90adcce527ea3eb098990c809ab69cbf64 (patch) | |
| tree | 89ebcc261730189b0d7657be68314b6afd8ec434 /src/addr2line.c | |
| parent | cb499c489299de2b77472fc836a6b28ecf5361b9 (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.c | 15 |
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 |
