From patchwork Mon Oct 31 09:57:53 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Wielaard X-Patchwork-Id: 689239 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3t6qZ62nlFz9s5w for ; Mon, 31 Oct 2016 20:58:37 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=Z1qPV7cM; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; q=dns; s=default; b=KNO7DUz2iqCL qKpp07Fdocfm9ZsA4+0ehmgJTpv1MborLuwbbnLirKuifNI24AWb/jorrdtL2gpe 7njTRNZieouWoXAi3W8CFSPDZqeIuAaQUuRCs5cqE1D7dObX1HPDPKVLvkiBdA6j 4EqX3he4rikCytNVV8VcNEw+560UGRA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; s=default; bh=Btlmy7mDACd3ecBbey YwkKOWr8o=; b=Z1qPV7cMvXHqcNK591QHuAgmA4oeZZEzUKRPPKf+Ef+QI3+0Yd 4vTt58Iitcqp5QUY0SAPaPrRriP5fdpuwbp6CPrmopSrl/0XtOZPpjqBo3AdHR8T GWhu5FqMsd1NstGIKr9yK4BRFj0YpC7kvkZM24EpuUuYn6IszjjKK9UuA= Received: (qmail 41100 invoked by alias); 31 Oct 2016 09:58:21 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 41039 invoked by uid 89); 31 Oct 2016 09:58:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, URIBL_RED autolearn=ham version=3.3.2 spammy=demangled, 1, 8, 930, Quote X-HELO: tarox.wildebeest.org Received: from herd.wildebeest.org (HELO tarox.wildebeest.org) (80.127.118.209) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 31 Oct 2016 09:58:09 +0000 Received: by tarox.wildebeest.org (Postfix, from userid 1000) id 3F58B4122889; Mon, 31 Oct 2016 10:58:07 +0100 (CET) From: Mark Wielaard To: gcc-patches@gcc.gnu.org Cc: Mark Wielaard Subject: [PATCH] libiberty: Fix memory leak in ada_demangle when symbol cannot be demangled. Date: Mon, 31 Oct 2016 10:57:53 +0100 Message-Id: <1477907873-18049-1-git-send-email-mjw@redhat.com> 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 5934bc1..73cbcc4 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-09-19 Andrew Stubbs * pex-win32.c (argv_to_cmdline): Quote zero-length parameters. 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);