]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
addr2line: Fix memory leak in print_dwarf_function.
authorMark Wielaard <mjw@redhat.com>
Tue, 9 Jun 2015 22:22:58 +0000 (00:22 +0200)
committerMark Wielaard <mjw@redhat.com>
Wed, 10 Jun 2015 12:14:57 +0000 (14:14 +0200)
Always free the scopes returned by dwarf_getscopes () when done.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
src/ChangeLog
src/addr2line.c

index 35c68c78b356aaf7a90edfad73d9ab1505e10465..15e6faea9cc30357581f84246dd9c274860f2ac5 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-09  Mark Wielaard  <mjw@redhat.com>
+
+       * addr2line.c (print_dwarf_function): Always free scopes before
+       returning.
+
 2015-06-09  Mark Wielaard  <mjw@redhat.com>
 
        * strip.c (handle_ar): Mark as unused.
index 97f988ff7c8f0dcb6b238fa951d388623520f29e..0ce854f6a911123263459491ac5b5c55ffda6d03 100644 (file)
@@ -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