diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-06-17 13:37:26 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2005-06-17 13:37:26 +0000 |
commit | 08d8fa11878dc2fb68745443a892106379121882 (patch) | |
tree | 728f34d5dc682cc5c0e5e598fe52a7bd8854486b /binutils | |
parent | d6ab8113e32876e3d8ca06ad090d3160d51c8e16 (diff) | |
download | fsf-binutils-gdb-08d8fa11878dc2fb68745443a892106379121882.zip fsf-binutils-gdb-08d8fa11878dc2fb68745443a892106379121882.tar.gz fsf-binutils-gdb-08d8fa11878dc2fb68745443a892106379121882.tar.bz2 |
* elf/external.h (GRP_ENTRY_SIZE): Define.
* readelf.c (CHECK_ENTSIZE_VALUES, CHECK_ENTSIZE): Define.
(process_section_headers): Use it.
(process_relocs): Don't crash if symsec is not SHT_SYMTAB
or SHT_DYNSYM.
(process_version_sections): Use sizeof (Elf_External_Versym)
instead of sh_entsize.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 9 | ||||
-rw-r--r-- | binutils/readelf.c | 31 |
2 files changed, 39 insertions, 1 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index f47a96f..4319811 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,12 @@ +2005-06-17 Jakub Jelinek <jakub@redhat.com> + + * readelf.c (CHECK_ENTSIZE_VALUES, CHECK_ENTSIZE): Define. + (process_section_headers): Use it. + (process_relocs): Don't crash if symsec is not SHT_SYMTAB + or SHT_DYNSYM. + (process_version_sections): Use sizeof (Elf_External_Versym) + instead of sh_entsize. + 2005-06-16 Nick Clifton <nickc@redhat.com> * rename.c (simple_copy): Only define if it is going to be used. diff --git a/binutils/readelf.c b/binutils/readelf.c index 970fbc0..0f945dc 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -3871,6 +3871,22 @@ process_section_headers (FILE *file) break; } +#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \ + do \ + { \ + size_t expected_entsize \ + = is_32bit_elf ? size32 : size64; \ + if (section->sh_entsize != expected_entsize) \ + error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \ + i, (unsigned long int) section->sh_entsize, \ + (unsigned long int) expected_entsize); \ + section->sh_entsize = expected_entsize; \ + } \ + while (0) +#define CHECK_ENTSIZE(section, i, type) \ + CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \ + sizeof (Elf64_External_##type)) + for (i = 0, section = section_headers; i < elf_header.e_shnum; i++, section++) @@ -3885,6 +3901,7 @@ process_section_headers (FILE *file) continue; } + CHECK_ENTSIZE (section, i, Sym); num_dynamic_syms = section->sh_size / section->sh_entsize; dynamic_symbols = GET_ELF_SYMBOLS (file, section); } @@ -3910,6 +3927,14 @@ process_section_headers (FILE *file) } symtab_shndx_hdr = section; } + else if (section->sh_type == SHT_SYMTAB) + CHECK_ENTSIZE (section, i, Sym); + else if (section->sh_type == SHT_GROUP) + CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE); + else if (section->sh_type == SHT_REL) + CHECK_ENTSIZE (section, i, Rel); + else if (section->sh_type == SHT_RELA) + CHECK_ENTSIZE (section, i, Rela); else if ((do_debugging || do_debug_info || do_debug_abbrevs || do_debug_lines || do_debug_pubnames || do_debug_aranges || do_debug_frames || do_debug_macinfo || do_debug_str @@ -4488,6 +4513,10 @@ process_relocs (FILE *file) char *strtab = NULL; symsec = SECTION_HEADER (section->sh_link); + if (symsec->sh_type != SHT_SYMTAB + && symsec->sh_type != SHT_DYNSYM) + continue; + nsyms = symsec->sh_size / symsec->sh_entsize; symtab = GET_ELF_SYMBOLS (file, symsec); @@ -6358,7 +6387,7 @@ process_version_sections (FILE *file) break; link_section = SECTION_HEADER (section->sh_link); - total = section->sh_size / section->sh_entsize; + total = section->sh_size / sizeof (Elf_External_Versym); if (SECTION_HEADER_INDEX (link_section->sh_link) >= elf_header.e_shnum) |