Discussion:
PR23952, memory leak in _bfd_generic_read_minisymbols
Alan Modra
2018-12-07 13:44:04 UTC
Permalink
The bfd patch fixes the PR, the binutils change another leak I
happened to notice.

bfd/
PR 23952
* syms.c (_bfd_generic_read_minisymbols): Free syms before
returning with zero symcount.
binutils/
* nm.c (display_rel_file): Use xrealloc to increase minisyms
for synthetic symbols.

diff --git a/bfd/syms.c b/bfd/syms.c
index e09640ab74..cbf85cb16d 100644
--- a/bfd/syms.c
+++ b/bfd/syms.c
@@ -822,9 +822,16 @@ _bfd_generic_read_minisymbols (bfd *abfd,
if (symcount < 0)
goto error_return;

- *minisymsp = syms;
- *sizep = sizeof (asymbol *);
-
+ if (symcount == 0)
+ /* We return 0 above when storage is 0. Exit in the same state
+ here, so as to not complicate callers with having to deal with
+ freeing memory for zero symcount. */
+ free (syms);
+ else
+ {
+ *minisymsp = syms;
+ *sizep = sizeof (asymbol *);
+ }
return symcount;

error_return:
diff --git a/binutils/nm.c b/binutils/nm.c
index 8807832f97..39083c3f4e 100644
--- a/binutils/nm.c
+++ b/binutils/nm.c
@@ -1175,17 +1175,14 @@ display_rel_file (bfd *abfd, bfd *archive_bfd)
if (synth_count > 0)
{
asymbol **symp;
- void *new_mini;
long i;

- new_mini = xmalloc ((symcount + synth_count + 1) * sizeof (*symp));
- symp = (asymbol **) new_mini;
- memcpy (symp, minisyms, symcount * sizeof (*symp));
- symp += symcount;
+ minisyms = xrealloc (minisyms,
+ (symcount + synth_count + 1) * sizeof (*symp));
+ symp = (asymbol **) minisyms + symcount;
for (i = 0; i < synth_count; i++)
*symp++ = synthsyms + i;
*symp = 0;
- minisyms = new_mini;
symcount += synth_count;
}
}
--
Alan Modra
Australia Development Lab, IBM
Loading...