This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB 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] libiberty: Fix memory leak in ada_demangle when symbol cannot be demangled.


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

commit aba19b625f34fb3d61263fe8044cf0c6d8804570
Author: Mark Wielaard <mjw@redhat.com>
Date:   Tue Nov 1 23:13:10 2016 +0000

    libiberty: Fix memory leak in ada_demangle when symbol cannot be demangled.
    
    When a symbol cannot be demangled in ada_demangle a new demangled VEC
    will be allocated without deleting the demangled VEC already in use.
    
    Running testsuite/test-demangle under valgrind will show the leak for
    this entry in testsuite/demangle-expected:
    
        # Elaborated flag (not demangled)
        --format=gnat
        x_E
        <x_E>
    
     11 bytes in 1 blocks are definitely lost in loss record 1 of 1
        at 0x4C27BE3: malloc (vg_replace_malloc.c:299)
        by 0x413FE7: xmalloc (xmalloc.c:148)
        by 0x4025EC: ada_demangle (cplus-dem.c:930)
        by 0x402C59: cplus_demangle (cplus-dem.c:892)
        by 0x400FEC: main (test-demangle.c:317)
    
    libiberty/ChangeLog:
    
    	* cplus-dem.c (ada_demangle): Initialize demangled to NULL and
    	XDELETEVEC demangled when unknown.

Diff:
---
 libiberty/ChangeLog   | 5 +++++
 libiberty/cplus-dem.c | 3 ++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 0865428..5bd7715 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,8 @@
+2016-10-31  Mark Wielaard  <mjw@redhat.com>
+
+	* cplus-dem.c (ada_demangle): Initialize demangled to NULL and
+	XDELETEVEC demangled when unknown.
+
 2016-10-17  Nick Clifton  <nickc@redhat.com>
 
 	* Sync with gcc.
diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c
index f954050..7f63397 100644
--- a/libiberty/cplus-dem.c
+++ b/libiberty/cplus-dem.c
@@ -911,7 +911,7 @@ ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED)
   int len0;
   const char* p;
   char *d;
-  char *demangled;
+  char *demangled = NULL;
   
   /* Discard leading _ada_, which is used for library level subprograms.  */
   if (strncmp (mangled, "_ada_", 5) == 0)
@@ -1156,6 +1156,7 @@ ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED)
   return demangled;
 
  unknown:
+  XDELETEVEC (demangled);
   len0 = strlen (mangled);
   demangled = XNEWVEC (char, len0 + 3);


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