[PATCH] Fix sig8_hash memory leak in libdw/dwarf_begin_elf.c if not valid_p.

Mark Wielaard mjw at redhat.com
Wed Dec 19 07:40:09 UTC 2012


On Tue, Dec 18, 2012 at 12:50:12PM -0800, Roland McGrath wrote:
> What about the other error cases in dwarf_begin_elf?

Those should of course clean up too, after Dwarf_Sig8_Hash_init () has
been called. Missed them because they are "real errors", while valid_p ()
is called more often for normal ELF files that just happen to not have
any valid DWARF sections.

Thanks,

Mark
-------------- next part --------------
>From 59254427e7c9eeb697de00069a9cb7dc1c908f86 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mjw at redhat.com>
Date: Tue, 18 Dec 2012 14:14:22 +0100
Subject: [PATCH] Fix sig8_hash memory leak in libdw/dwarf_begin_elf.c on
 error.

Signed-off-by: Mark Wielaard <mjw at redhat.com>
---
 libdw/ChangeLog         | 7 +++++++
 libdw/dwarf_begin_elf.c | 6 ++++++
 2 files changed, 13 insertions(+)

diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 0d35ca9..24f4bb4 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,10 @@
+2012-12-18  Mark Wielaard  <mjw at redhat.com>
+
+	* dwarf_begin_elf.c (valid_p): Call Dwarf_Sig8_Hash_free if invalid.
+	(check_section): Likewise on error.
+	(scngrp_read): Likewise.
+	(dwarf_begin_elf): Likewise.
+
 2012-10-09  Petr Machata  <pmachata at redhat.com>
 
 	* dwarf_getlocation.c (__libdw_intern_expression): Handle
diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c
index a9c826c..6cf3aa1 100644
--- a/libdw/dwarf_begin_elf.c
+++ b/libdw/dwarf_begin_elf.c
@@ -216,6 +216,7 @@ check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
       /* The section name must be valid.  Otherwise is the ELF file
 	 invalid.  */
       __libdw_free_zdata (result);
+      Dwarf_Sig8_Hash_free (&result->sig8_hash);
       __libdw_seterrno (DWARF_E_INVALID_ELF);
       free (result);
       return NULL;
@@ -344,6 +345,7 @@ valid_p (Dwarf *result)
       && unlikely (result->sectiondata[IDX_debug_info] == NULL))
     {
       __libdw_free_zdata (result);
+      Dwarf_Sig8_Hash_free (&result->sig8_hash);
       __libdw_seterrno (DWARF_E_NO_DWARF);
       free (result);
       result = NULL;
@@ -375,6 +377,7 @@ scngrp_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr, Elf_Scn *scngrp)
     {
       /* We cannot read the section content.  Fail!  */
       __libdw_free_zdata (result);
+      Dwarf_Sig8_Hash_free (&result->sig8_hash);
       free (result);
       return NULL;
     }
@@ -391,6 +394,7 @@ scngrp_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr, Elf_Scn *scngrp)
 	  /* A section group refers to a non-existing section.  Should
 	     never happen.  */
 	  __libdw_free_zdata (result);
+	  Dwarf_Sig8_Hash_free (&result->sig8_hash);
 	  __libdw_seterrno (DWARF_E_INVALID_ELF);
 	  free (result);
 	  return NULL;
@@ -471,11 +475,13 @@ dwarf_begin_elf (elf, cmd, scngrp)
     }
   else if (cmd == DWARF_C_WRITE)
     {
+      Dwarf_Sig8_Hash_free (&result->sig8_hash);
       __libdw_seterrno (DWARF_E_UNIMPL);
       free (result);
       return NULL;
     }
 
+  Dwarf_Sig8_Hash_free (&result->sig8_hash);
   __libdw_seterrno (DWARF_E_INVALID_CMD);
   free (result);
   return NULL;
-- 
1.7.11.7



More information about the elfutils-devel mailing list