bfin reloc offset checks

These all ought to use bfd_reloc_offset_in_range.  In particular, replace
the check using howto->size + 1u.

	* elf32-bfin.c (bfin_pcrel24_reloc): Use bfd_reloc_offset_in_range.
	(bfin_imm16_reloc, bfin_byte4_reloc, bfin_bfd_reloc),
	(bfin_final_link_relocate): Likewise.
This commit is contained in:
Alan Modra
2022-06-08 18:34:15 +09:30
parent 5d0feb989c
commit 5d2834cc7e

View File

@ -59,9 +59,8 @@ bfin_pcrel24_reloc (bfd *abfd,
reloc_howto_type *howto = reloc_entry->howto; reloc_howto_type *howto = reloc_entry->howto;
asection *output_section; asection *output_section;
bool relocatable = (output_bfd != NULL); bool relocatable = (output_bfd != NULL);
bfd_size_type limit = bfd_get_section_limit_octets (abfd, input_section);
if (addr - 2 > limit || limit - (addr - 2) < 2) if (!bfd_reloc_offset_in_range (howto, abfd, input_section, addr - 2))
return bfd_reloc_outofrange; return bfd_reloc_outofrange;
if (bfd_is_und_section (symbol->section) if (bfd_is_und_section (symbol->section)
@ -157,10 +156,9 @@ bfin_imm16_reloc (bfd *abfd,
reloc_howto_type *howto = reloc_entry->howto; reloc_howto_type *howto = reloc_entry->howto;
asection *output_section; asection *output_section;
bool relocatable = (output_bfd != NULL); bool relocatable = (output_bfd != NULL);
bfd_size_type limit = bfd_get_section_limit_octets (abfd, input_section);
/* Is the address of the relocation really within the section? */ /* Is the address of the relocation really within the section? */
if (reloc_addr > limit || limit - reloc_addr < 2) if (!bfd_reloc_offset_in_range (howto, abfd, input_section, reloc_addr))
return bfd_reloc_outofrange; return bfd_reloc_outofrange;
if (bfd_is_und_section (symbol->section) if (bfd_is_und_section (symbol->section)
@ -229,10 +227,10 @@ bfin_byte4_reloc (bfd *abfd,
bfd_vma output_base = 0; bfd_vma output_base = 0;
asection *output_section; asection *output_section;
bool relocatable = (output_bfd != NULL); bool relocatable = (output_bfd != NULL);
bfd_size_type limit = bfd_get_section_limit_octets (abfd, input_section);
/* Is the address of the relocation really within the section? */ /* Is the address of the relocation really within the section? */
if (addr > limit || limit - addr < 4) if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section,
addr))
return bfd_reloc_outofrange; return bfd_reloc_outofrange;
if (bfd_is_und_section (symbol->section) if (bfd_is_und_section (symbol->section)
@ -297,10 +295,9 @@ bfin_bfd_reloc (bfd *abfd,
reloc_howto_type *howto = reloc_entry->howto; reloc_howto_type *howto = reloc_entry->howto;
asection *output_section; asection *output_section;
bool relocatable = (output_bfd != NULL); bool relocatable = (output_bfd != NULL);
bfd_size_type limit = bfd_get_section_limit_octets (abfd, input_section);
/* Is the address of the relocation really within the section? */ /* Is the address of the relocation really within the section? */
if (addr > limit || limit - addr < howto->size + 1u) if (!bfd_reloc_offset_in_range (howto, abfd, input_section, addr))
return bfd_reloc_outofrange; return bfd_reloc_outofrange;
if (bfd_is_und_section (symbol->section) if (bfd_is_und_section (symbol->section)
@ -1320,11 +1317,10 @@ bfin_final_link_relocate (Elf_Internal_Rela *rel, reloc_howto_type *howto,
{ {
bfd_reloc_status_type r = bfd_reloc_ok; bfd_reloc_status_type r = bfd_reloc_ok;
bfd_vma x; bfd_vma x;
bfd_size_type limit = bfd_get_section_limit_octets (input_bfd,
input_section);
if (address - 2 > limit || limit - (address - 2) < 4) if (!bfd_reloc_offset_in_range (howto, input_bfd, input_section,
return bfd_reloc_outofrange; address - 2))
return bfd_reloc_outofrange;
value += addend; value += addend;