summaryrefslogtreecommitdiffstats
path: root/src/objdump.c
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2014-12-04 17:01:20 +0100
committerMark Wielaard <[email protected]>2014-12-04 17:01:20 +0100
commitd0070a982cfddbff9c3f744b518b4cde539e5e65 (patch)
treef7359fcc7f611189b0c1bd42cbfe08ed6f098e55 /src/objdump.c
parent0ed4f98a89fd465c25eb8ac2ef75c10a82f9c5e0 (diff)
objdump: Add various sanity checks to guard against corrupted data.
Reported-by: Alexander Cherepanov <[email protected]> Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'src/objdump.c')
-rw-r--r--src/objdump.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/objdump.c b/src/objdump.c
index 5376447a..87290ccb 100644
--- a/src/objdump.c
+++ b/src/objdump.c
@@ -389,7 +389,7 @@ show_relocs_x (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *symdata,
? xndx : sym->st_shndx),
&destshdr_mem);
- if (shdr == NULL)
+ if (shdr == NULL || destshdr == NULL)
printf ("<%s %ld>",
gettext ("INVALID SECTION"),
(long int) (sym->st_shndx == SHN_XINDEX
@@ -418,7 +418,8 @@ show_relocs_rel (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
Elf_Data *symdata, Elf_Data *xndxdata, size_t symstrndx,
size_t shstrndx)
{
- int nentries = shdr->sh_size / shdr->sh_entsize;
+ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_REL, 1, EV_CURRENT);
+ int nentries = shdr->sh_size / sh_entsize;
for (int cnt = 0; cnt < nentries; ++cnt)
{
@@ -438,7 +439,8 @@ show_relocs_rela (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
Elf_Data *symdata, Elf_Data *xndxdata, size_t symstrndx,
size_t shstrndx)
{
- int nentries = shdr->sh_size / shdr->sh_entsize;
+ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELA, 1, EV_CURRENT);
+ int nentries = shdr->sh_size / sh_entsize;
for (int cnt = 0; cnt < nentries; ++cnt)
{
@@ -506,6 +508,8 @@ show_relocs (Ebl *ebl, const char *fname, uint32_t shstrndx)
GElf_Shdr *destshdr = gelf_getshdr (elf_getscn (ebl->elf,
shdr->sh_info),
&destshdr_mem);
+ if (unlikely (destshdr == NULL))
+ continue;
printf (gettext ("\nRELOCATION RECORDS FOR [%s]:\n"
"%-*s TYPE VALUE\n"),
@@ -522,6 +526,8 @@ show_relocs (Ebl *ebl, const char *fname, uint32_t shstrndx)
GElf_Shdr symshdr_mem;
GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
Elf_Data *symdata = elf_getdata (symscn, NULL);
+ if (unlikely (symshdr == NULL || symdata == NULL))
+ continue;
/* Search for the optional extended section index table. */
Elf_Data *xndxdata = NULL;