This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: PATCH: Check bad symbol index in ia64 reloc
- From: "H. J. Lu" <hjl at lucon dot org>
- To: binutils at sources dot redhat dot com
- Date: Wed, 24 Sep 2003 11:33:48 -0700
- Subject: Re: PATCH: Check bad symbol index in ia64 reloc
- References: <20030923194930.GA23637@lucon.org> <20030924021128.GO2768@bubble.sa.bigpond.net.au>
On Wed, Sep 24, 2003 at 11:41:28AM +0930, Alan Modra wrote:
> On Tue, Sep 23, 2003 at 12:49:30PM -0700, H. J. Lu wrote:
> > The ia64 linker may crash on bad symbol index in reloc for an invalid
> > input file. This patch checks it.
>
> To give all targets the benefit of this check, how about implementing
> your check in elflink.c:elf_link_read_relocs_from_section instead?.
>
Like this?
H.J.
---
2003-09-25 H.J. Lu <hongjiu.lu@intel.com>
* elflink.c (elf_link_read_relocs_from_section): Add an argument
of a pointer to section. Check bad symbol index.
(_bfd_elf_link_read_relocs): Modify calls to
elf_link_read_relocs_from_section.
--- bfd/elflink.c.bad 2003-09-19 08:13:13.000000000 -0700
+++ bfd/elflink.c 2003-09-24 11:28:30.000000000 -0700
@@ -1879,6 +1879,7 @@ _bfd_elf_link_assign_sym_version (struct
static bfd_boolean
elf_link_read_relocs_from_section (bfd *abfd,
+ asection *sec,
Elf_Internal_Shdr *shdr,
void *external_relocs,
Elf_Internal_Rela *internal_relocs)
@@ -1888,6 +1889,8 @@ elf_link_read_relocs_from_section (bfd *
const bfd_byte *erela;
const bfd_byte *erelaend;
Elf_Internal_Rela *irela;
+ Elf_Internal_Shdr *symtab_hdr;
+ size_t nsyms;
/* If there aren't any relocations, that's OK. */
if (!shdr)
@@ -1901,6 +1904,9 @@ elf_link_read_relocs_from_section (bfd *
if (bfd_bread (external_relocs, shdr->sh_size, abfd) != shdr->sh_size)
return FALSE;
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ nsyms = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
+
bed = get_elf_backend_data (abfd);
/* Convert the external relocations to the internal format. */
@@ -1919,7 +1925,21 @@ elf_link_read_relocs_from_section (bfd *
irela = internal_relocs;
while (erela < erelaend)
{
+ unsigned long r_symndx;
+
(*swap_in) (abfd, erela, irela);
+ r_symndx = (bfd_get_arch_size (abfd) == 32)
+ ? ELF32_R_SYM (irela->r_info)
+ : ELF64_R_SYM (irela->r_info);
+ if (r_symndx >= nsyms)
+ {
+ (*_bfd_error_handler)
+ (_("%s: bad reloc symbol index (0x%lx >= 0x%lx) for offset 0x%lx in section `%s'"),
+ bfd_archive_filename (abfd), r_symndx,
+ (unsigned long) nsyms, irela->r_offset, sec->name);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
irela += bed->s->int_rels_per_ext_rel;
erela += shdr->sh_entsize;
}
@@ -1983,12 +2003,12 @@ _bfd_elf_link_read_relocs (bfd *abfd,
external_relocs = alloc1;
}
- if (!elf_link_read_relocs_from_section (abfd, rel_hdr,
+ if (!elf_link_read_relocs_from_section (abfd, o, rel_hdr,
external_relocs,
internal_relocs))
goto error_return;
if (!elf_link_read_relocs_from_section
- (abfd,
+ (abfd, o,
elf_section_data (o)->rel_hdr2,
((bfd_byte *) external_relocs) + rel_hdr->sh_size,
internal_relocs + (NUM_SHDR_ENTRIES (rel_hdr)