bfin reloc offset checks
authorAlan Modra <amodra@gmail.com>
Wed, 8 Jun 2022 09:04:15 +0000 (18:34 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 8 Jun 2022 12:03:00 +0000 (21:33 +0930)
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.

bfd/elf32-bfin.c

index b41c212c2bac6ea5de1c479bace2a5d1c5f2cb73..babc57e3955b23e2b890db49206e6ae998e4ff29 100644 (file)
@@ -59,9 +59,8 @@ bfin_pcrel24_reloc (bfd *abfd,
   reloc_howto_type *howto = reloc_entry->howto;
   asection *output_section;
   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;
 
   if (bfd_is_und_section (symbol->section)
@@ -157,10 +156,9 @@ bfin_imm16_reloc (bfd *abfd,
   reloc_howto_type *howto = reloc_entry->howto;
   asection *output_section;
   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?  */
-  if (reloc_addr > limit || limit - reloc_addr < 2)
+  if (!bfd_reloc_offset_in_range (howto, abfd, input_section, reloc_addr))
     return bfd_reloc_outofrange;
 
   if (bfd_is_und_section (symbol->section)
@@ -229,10 +227,10 @@ bfin_byte4_reloc (bfd *abfd,
   bfd_vma output_base = 0;
   asection *output_section;
   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?  */
-  if (addr > limit || limit - addr < 4)
+  if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section,
+                                 addr))
     return bfd_reloc_outofrange;
 
   if (bfd_is_und_section (symbol->section)
@@ -297,10 +295,9 @@ bfin_bfd_reloc (bfd *abfd,
   reloc_howto_type *howto = reloc_entry->howto;
   asection *output_section;
   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?  */
-  if (addr > limit || limit - addr < howto->size + 1u)
+  if (!bfd_reloc_offset_in_range (howto, abfd, input_section, addr))
     return bfd_reloc_outofrange;
 
   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_vma x;
-      bfd_size_type limit = bfd_get_section_limit_octets (input_bfd,
-                                                         input_section);
 
-      if (address - 2 > limit || limit - (address - 2) < 4)
-       return bfd_reloc_outofrange;
+      if (!bfd_reloc_offset_in_range (howto, input_bfd, input_section,
+                                     address - 2))
+         return bfd_reloc_outofrange;
 
       value += addend;