summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2012-03-28 11:20:36 +0200
committerMark Wielaard <mjw@redhat.com>2012-03-28 19:56:02 +0200
commit61651c110e4271cdea4ae153813898684bf9f0f8 (patch)
treea292432de59e774ad66332bcfb42b13b69c25923
parent210c2f03efbbaacc51f2641baa0947d9c316de12 (diff)
downloadelfutils-61651c110e4271cdea4ae153813898684bf9f0f8.tar.gz
readelf.c: Check debug section data before trying to print abbrev or str.
* readelf.c (print_debug_abbrev_section): Check there is Dwarf section data. (print_debug_str_section): Likewise.
-rw-r--r--src/ChangeLog6
-rw-r--r--src/readelf.c8
2 files changed, 12 insertions, 2 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 62817567..30be3e13 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2012-03-28 Mark Wielaard <mjw@redhat.com>
+
+ * readelf.c (print_debug_abbrev_section): Check there is Dwarf
+ section data.
+ (print_debug_str_section): Likewise.
+
2012-03-21 Mark Wielaard <mjw@redhat.com>
* readelf.c (print_gdb_index_section): Accept version 6.
diff --git a/src/readelf.c b/src/readelf.c
index f9f56aad..b70779dd 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -4566,13 +4566,16 @@ print_debug_abbrev_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
Ebl *ebl, GElf_Ehdr *ehdr,
Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
{
+ const size_t sh_size = (dbg->sectiondata[IDX_debug_abbrev] ?
+ dbg->sectiondata[IDX_debug_abbrev]->d_size : 0);
+
printf (gettext ("\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"
" [ Code]\n"),
elf_ndxscn (scn), section_name (ebl, ehdr, shdr),
(uint64_t) shdr->sh_offset);
Dwarf_Off offset = 0;
- while (offset < dbg->sectiondata[IDX_debug_abbrev]->d_size)
+ while (offset < sh_size)
{
printf (gettext ("\nAbbreviation section at offset %" PRIu64 ":\n"),
offset);
@@ -6781,7 +6784,8 @@ print_debug_str_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
Ebl *ebl, GElf_Ehdr *ehdr,
Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
{
- const size_t sh_size = dbg->sectiondata[IDX_debug_str]->d_size;
+ const size_t sh_size = (dbg->sectiondata[IDX_debug_str] ?
+ dbg->sectiondata[IDX_debug_str]->d_size : 0);
/* Compute floor(log16(shdr->sh_size)). */
GElf_Addr tmp = sh_size;