diff options
author | Mark Wielaard <mjw@redhat.com> | 2016-11-01 23:13:10 +0000 |
---|---|---|
committer | Mark Wielaard <mark@gcc.gnu.org> | 2016-11-01 23:13:10 +0000 |
commit | a3f3eec079677bc6042dc7b00e8f85f644b97d57 (patch) | |
tree | c6c4281d638ba42a7cbf50facf09bdb390eef6ed /libiberty/cplus-dem.c | |
parent | be6218568d56e62aa3b53d962eaf41dd03b76701 (diff) | |
download | gcc-a3f3eec079677bc6042dc7b00e8f85f644b97d57.zip gcc-a3f3eec079677bc6042dc7b00e8f85f644b97d57.tar.gz gcc-a3f3eec079677bc6042dc7b00e8f85f644b97d57.tar.bz2 |
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.
From-SVN: r241760
Diffstat (limited to 'libiberty/cplus-dem.c')
-rw-r--r-- | libiberty/cplus-dem.c | 3 |
1 files changed, 2 insertions, 1 deletions
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); |