aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-04-19 17:05:02 +0930
committerAlan Modra <amodra@gmail.com>2020-04-20 08:15:05 +0930
commitceb9bf11b99f4a1d4a321e6e64c01f34a185cd18 (patch)
treea68e8ecc157f39ab442a3c25a968321448783de7 /binutils
parent2efec98b28bbc89fc8e062709c7e28cc8a56ee40 (diff)
downloadgdb-ceb9bf11b99f4a1d4a321e6e64c01f34a185cd18.zip
gdb-ceb9bf11b99f4a1d4a321e6e64c01f34a185cd18.tar.gz
gdb-ceb9bf11b99f4a1d4a321e6e64c01f34a185cd18.tar.bz2
readelf memory leaks
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.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog8
-rw-r--r--binutils/readelf.c11
2 files changed, 14 insertions, 5 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 1b6a2f9..92d9b29 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 0ea8273..601e329 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -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