Fix memory leak and set libdw errno when intern_fde cannot parse start/end.
authorMark Wielaard <mjw@redhat.com>
Thu, 12 Sep 2013 13:49:47 +0000 (15:49 +0200)
committerMark Wielaard <mjw@redhat.com>
Thu, 12 Sep 2013 13:49:47 +0000 (15:49 +0200)
Signed-off-by: Mark Wielaard <mjw@redhat.com>
libdw/ChangeLog
libdw/fde.c

index c8398b2..1a85194 100644 (file)
@@ -1,3 +1,8 @@
+2013-09-12  Mark Wielaard  <mjw@redhat.com>
+
+       * fde.c (intern_fde): Free fde and set libdw errno when start
+       or end could not be read.
+
 2013-08-24  Mark Wielaard  <mjw@redhat.com>
 
        * dwarf_getlocation.c (store_implicit_value): Don't take data
index 32c77b0..91ce732 100644 (file)
@@ -83,7 +83,11 @@ intern_fde (Dwarf_CFI *cache, const Dwarf_FDE *entry)
                                    &fde->instructions, &fde->start))
       || unlikely (read_encoded_value (cache, cie->fde_encoding & 0x0f,
                                       &fde->instructions, &fde->end)))
-    return NULL;
+    {
+      free (fde);
+      __libdw_seterrno (DWARF_E_INVALID_DWARF);
+      return NULL;
+    }
   fde->end += fde->start;
 
   fde->cie = cie;