* elfcode.h (elf_object_p): Allow files with corrupt e_shstrndx fields to
  still be handled as ELF files.
* readelf.c (SECTION_NAME): Cope with a missing string table.
  (process_file_header): Cope with a corrupt e_shstrndx field.
  (process_section_headers): Correctly handle an e_shstrndx value of SHF_UNDEF.
This commit is contained in:
Nick Clifton 2006-04-18 09:41:36 +00:00
parent 0275de4ee1
commit 0b49d37123
4 changed files with 42 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2006-04-18 Nick Clifton <nickc@redhat.com>
PR 2257
* elfcode.h (elf_object_p): Allow files with corrupt e_shstrndx
fields to still be handled as ELF files.
2006-04-16 Daniel Jacobowitz <dan@codesourcery.com>
* po/SRC-POTFILES.in: Regenerated.

View File

@ -742,9 +742,18 @@ elf_object_p (bfd *abfd)
if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
|| (i_ehdrp->e_shstrndx >= SHN_LORESERVE
&& i_ehdrp->e_shstrndx <= SHN_HIRESERVE))
goto got_wrong_format_error;
{
/* PR 2257:
We used to just goto got_wrong_format_error here
but there are binaries in existance for which this test
will prevent the binutils from working with them at all.
So we are kind, and reset the string index value to 0
so that at least some processing can be done. */
i_ehdrp->e_shstrndx = SHN_UNDEF;
_bfd_error_handler (_("warning: %s has a corrupt string table index - ignoring"), abfd->filename);
}
}
else if (i_ehdrp->e_shstrndx != 0)
else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
goto got_wrong_format_error;
/* Read in the program headers. */

View File

@ -1,3 +1,11 @@
2006-04-18 Nick Clifton <nickc@redhat.com>
PR 2257
* readelf.c (SECTION_NAME): Cope with a missing string table.
(process_file_header): Cope with a corrupt e_shstrndx field.
(process_section_headers): Correctly handle an e_shstrndx value of
SHF_UNDEF.
2006-04-12 Nick Clifton <nickc@redhat.com>
* objdump.c (objdump_symbol_at_address): Fix typo in comment.

View File

@ -222,9 +222,11 @@ static void (*byte_put) (unsigned char *, bfd_vma, int);
#define UNKNOWN -1
#define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
((X)->sh_name >= string_table_length \
? "<corrupt>" : string_table + (X)->sh_name))
#define SECTION_NAME(X) \
((X) == NULL ? "<none>" \
: string_table == NULL ? "<no-name>" \
: ((X)->sh_name >= string_table_length ? "<corrupt>" \
: string_table + (X)->sh_name))
/* Given st_shndx I, map to section_headers index. */
#define SECTION_HEADER_INDEX(I) \
@ -3142,6 +3144,11 @@ process_file_header (void)
(long) elf_header.e_shstrndx);
if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
printf (" (%ld)", (long) section_headers[0].sh_link);
else if (elf_header.e_shstrndx != SHN_UNDEF
&& (elf_header.e_shstrndx >= elf_header.e_shnum
|| (elf_header.e_shstrndx >= SHN_LORESERVE
&& elf_header.e_shstrndx <= SHN_HIRESERVE)))
printf (" <corrupt: out of range>");
putc ('\n', stdout);
}
@ -3151,6 +3158,11 @@ process_file_header (void)
elf_header.e_shnum = section_headers[0].sh_size;
if (elf_header.e_shstrndx == SHN_XINDEX)
elf_header.e_shstrndx = section_headers[0].sh_link;
else if (elf_header.e_shstrndx != SHN_UNDEF
&& (elf_header.e_shstrndx >= elf_header.e_shnum
|| (elf_header.e_shstrndx >= SHN_LORESERVE
&& elf_header.e_shstrndx <= SHN_HIRESERVE)))
elf_header.e_shstrndx = SHN_UNDEF;
free (section_headers);
section_headers = NULL;
}
@ -3920,7 +3932,8 @@ process_section_headers (FILE *file)
return 0;
/* Read in the string table, so that we have names to display. */
if (SECTION_HEADER_INDEX (elf_header.e_shstrndx) < elf_header.e_shnum)
if (elf_header.e_shstrndx != SHN_UNDEF
&& SECTION_HEADER_INDEX (elf_header.e_shstrndx) < elf_header.e_shnum)
{
section = SECTION_HEADER (elf_header.e_shstrndx);