This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] PR23952, memory leak in _bfd_generic_read_minisymbols


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c2f5dc30afa34696f2da0081c4ac50b958ecb0e9

commit c2f5dc30afa34696f2da0081c4ac50b958ecb0e9
Author: Alan Modra <amodra@gmail.com>
Date:   Fri Dec 7 23:39:42 2018 +1030

    PR23952, memory leak in _bfd_generic_read_minisymbols
    
    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:
---
 bfd/ChangeLog      |  6 ++++++
 bfd/syms.c         | 13 ++++++++++---
 binutils/ChangeLog |  5 +++++
 binutils/nm.c      |  9 +++------
 4 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8a37271..b7d6717 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2018-12-07  Alan Modra  <amodra@gmail.com>
+
+	PR 23952
+	* syms.c (_bfd_generic_read_minisymbols): Free syms before
+	returning with zero symcount.
+
 2018-12-06  Alan Modra  <amodra@gmail.com>
 
 	* elf32-ppc.c (ppc_elf_howto_raw <R_PPC_VLE_ADDR20>): Correct
diff --git a/bfd/syms.c b/bfd/syms.c
index e09640a..cbf85cb 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/ChangeLog b/binutils/ChangeLog
index d865bf6..a75f83b 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,8 @@
+2018-12-07  Alan Modra  <amodra@gmail.com>
+
+	* nm.c (display_rel_file): Use xrealloc to increase minisyms
+	for synthetic symbols.
+
 2018-12-07  Nick Clifton  <nickc@redhat.com>
 
 	* addr2line.c (demangle_flags): New static variable.
diff --git a/binutils/nm.c b/binutils/nm.c
index 8807832..39083c3 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;
 	}
     }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]