diff options
author | Alan Modra <amodra@gmail.com> | 2020-04-19 17:05:02 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-04-20 08:15:05 +0930 |
commit | ceb9bf11b99f4a1d4a321e6e64c01f34a185cd18 (patch) | |
tree | a68e8ecc157f39ab442a3c25a968321448783de7 /binutils | |
parent | 2efec98b28bbc89fc8e062709c7e28cc8a56ee40 (diff) | |
download | gdb-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/ChangeLog | 8 | ||||
-rw-r--r-- | binutils/readelf.c | 11 |
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 |