From aba19b625f34fb3d61263fe8044cf0c6d8804570 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 1 Nov 2016 23:13:10 +0000 Subject: [PATCH] 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 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. --- libiberty/ChangeLog | 5 +++++ libiberty/cplus-dem.c | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 0865428a08..5bd771521c 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2016-10-31 Mark Wielaard + + * cplus-dem.c (ada_demangle): Initialize demangled to NULL and + XDELETEVEC demangled when unknown. + 2016-10-17 Nick Clifton * Sync with gcc. diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c index f95405062c..7f63397f2d 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); -- 2.34.1