readelf memory leaks
authorAlan Modra <amodra@gmail.com>
Sun, 19 Apr 2020 07:35:02 +0000 (17:05 +0930)
committerAlan Modra <amodra@gmail.com>
Sun, 19 Apr 2020 22:45:05 +0000 (08:15 +0930)
This fixes two leaks found in the new code supporting display of
dynamic symbols retrieved via dynamic tags.

* readelf.c (get_num_dynamic_syms): Formatting.  Don't return
on error without freeing.
(process_dynamic_section): Don't recreate dynamic symbols from
dynamic tag info when the dynamic symbols have already been
read via section headers.

binutils/ChangeLog
binutils/readelf.c

index 1b6a2f9b8fbc6cb0981f36f518439133da3de890..92d9b298ee76891ecff079712c3d63b3097424a9 100644 (file)
@@ -1,3 +1,11 @@
+2020-04-20  Alan Modra  <amodra@gmail.com>
+
+       * readelf.c (get_num_dynamic_syms): Formatting.  Don't return
+       on error without freeing.
+       (process_dynamic_section): Don't recreate dynamic symbols from
+       dynamic tag info when the dynamic symbols have already been
+       read via section headers.
+
 2020-04-17  Fredrik Strupe  <fredrik@strupe.net>
 
        * testsuite/binutils-all/arm/vdup-cond.d: New test for testing that
index 0ea8273ab113eefac05f42f19bb5579e895a1355..601e329fdcf0a961eb4c73c71dbba55e46d47974 100644 (file)
@@ -9976,7 +9976,7 @@ get_num_dynamic_syms (Filedata * filedata)
       if (buckets != NULL && chains != NULL)
        num_of_syms = nchains;
 
-  no_hash:
+    no_hash:
       if (num_of_syms == 0)
        {
          if (buckets)
@@ -10052,7 +10052,7 @@ get_num_dynamic_syms (Filedata * filedata)
            if (gnubuckets[i] < gnusymidx)
              {
                gnu_hash_error = TRUE;
-               return FALSE;
+               goto no_gnu_hash;
              }
 
            if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
@@ -10083,7 +10083,7 @@ get_num_dynamic_syms (Filedata * filedata)
          if (fread (nb, 4, 1, filedata->handle) != 1)
            {
              error (_("Failed to determine last chain length\n"));
-         gnu_hash_error = TRUE;
+             gnu_hash_error = TRUE;
              goto no_gnu_hash;
            }
 
@@ -10156,7 +10156,7 @@ get_num_dynamic_syms (Filedata * filedata)
            while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
          }
 
-  no_gnu_hash:
+    no_gnu_hash:
       if (gnu_hash_error)
        {
          if (mipsxlat)
@@ -10260,7 +10260,8 @@ process_dynamic_section (Filedata * filedata)
 
                if (vma >= (seg->p_vaddr & -seg->p_align)
                    && vma <= seg->p_vaddr + seg->p_filesz
-                   && (num_of_syms = get_num_dynamic_syms (filedata)))
+                   && (num_of_syms = get_num_dynamic_syms (filedata)) != 0
+                   && dynamic_symbols == NULL)
                  {
                    /* Since we do not know how big the symbol table is,
                       we default to reading in up to the end of PT_LOAD