From ceb9bf11b99f4a1d4a321e6e64c01f34a185cd18 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 19 Apr 2020 17:05:02 +0930 Subject: [PATCH] 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. --- binutils/ChangeLog | 8 ++++++++ binutils/readelf.c | 11 ++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 1b6a2f9b8fb..92d9b298ee7 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,11 @@ +2020-04-20 Alan Modra + + * 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 * testsuite/binutils-all/arm/vdup-cond.d: New test for testing that diff --git a/binutils/readelf.c b/binutils/readelf.c index 0ea8273ab11..601e329fdcf 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 -- 2.30.2