libdwfl: Clear symtab result on error before using find_dynsym fallback.
authorMark Wielaard <mjw@redhat.com>
Mon, 26 Jan 2015 15:34:57 +0000 (16:34 +0100)
committerMark Wielaard <mjw@redhat.com>
Fri, 6 Feb 2015 21:40:50 +0000 (22:40 +0100)
find_dynsym could succeed after find_symtab failed but had already set up
symdata, syments and first_global. find_dynsym would not set or clear
first_global since all syms in dynsym are global. Causing lots of failing
lookups when calling __libdwfl_addrsym if first_global was some huge
bogus value.

Reported-by: Hanno Böck <hanno@hboeck.de>
Signed-off-by: Mark Wielaard <mjw@redhat.com>
libdwfl/ChangeLog
libdwfl/dwfl_module_getdwarf.c

index 5a97578..d40dbae 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-26  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_module_getdwarf.c (find_symtab): Explicitly clear symdata,
+       syments and first_global on elferr before calling find_dynsym.
+
 2014-12-27  Mark Wielaard  <mjw@redhat.com>
 
        * dwfl_module_getsrc.c (dwfl_module_getsrc): Never match a line that
index 494407d..a31898a 100644 (file)
@@ -1083,6 +1083,9 @@ find_symtab (Dwfl_Module *mod)
   if (elf_strptr (mod->symfile->elf, strshndx, 0) == NULL)
     {
     elferr:
+      mod->symdata = NULL;
+      mod->syments = 0;
+      mod->first_global = 0;
       mod->symerr = DWFL_E (LIBELF, elf_errno ());
       goto aux_cleanup; /* This cleans up some more and tries find_dynsym.  */
     }