diff options
author | Nick Clifton <nickc@redhat.com> | 2006-04-18 09:41:36 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2006-04-18 09:41:36 +0000 |
commit | 0b49d371230ed1a85925a509755c87a750e0447c (patch) | |
tree | 3e68e4aad2473befcc3a92cd6d8f3965b3152633 /binutils | |
parent | 0275de4ee1b6996c19d19704fc3fe3b19d26e64f (diff) | |
download | gdb-0b49d371230ed1a85925a509755c87a750e0447c.zip gdb-0b49d371230ed1a85925a509755c87a750e0447c.tar.gz gdb-0b49d371230ed1a85925a509755c87a750e0447c.tar.bz2 |
PR 2257
* 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.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 8 | ||||
-rw-r--r-- | binutils/readelf.c | 21 |
2 files changed, 25 insertions, 4 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index fdb3934..2f25dc9 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -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. diff --git a/binutils/readelf.c b/binutils/readelf.c index d8bd54f..09f1d51 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -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); |