aboutsummaryrefslogtreecommitdiff
path: root/bfd/reloc16.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-03-07 22:21:28 +1030
committerAlan Modra <amodra@gmail.com>2023-03-08 11:24:50 +1030
commitd64c8f7181fd21f90983f8d55369f6f9a2960c43 (patch)
tree2121d1b6c59faefb19dd040ebe4eb57929782f76 /bfd/reloc16.c
parentb9ee26d9ca29b5f598772de9f78c3da21cfa6c1b (diff)
downloadgdb-d64c8f7181fd21f90983f8d55369f6f9a2960c43.zip
gdb-d64c8f7181fd21f90983f8d55369f6f9a2960c43.tar.gz
gdb-d64c8f7181fd21f90983f8d55369f6f9a2960c43.tar.bz2
z8 and z80 coff_reloc16_extra_cases sanity checks
* reloc16.c (bfd_coff_reloc16_get_relocated_section_contents): Use size_t variables. Sanity check reloc address. Handle errors from bfd_coff_reloc16_extra_cases. * coffcode.h (_bfd_coff_reloc16_extra_cases): Return bool, take size_t* args. (dummy_reloc16_extra_cases): Adjust to suit. Don't abort. * coff-z80.c (extra_case): Sanity check reloc address. Return errors. Tidy formatting. Use bfd_signed_vma temp var to check for reloc overflow. Don't abort on unexpected reloc type, instead print an error and return false. * coff-z8k.c (extra_case): Likewise. * libcoff.h: Regenerate.
Diffstat (limited to 'bfd/reloc16.c')
-rw-r--r--bfd/reloc16.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/bfd/reloc16.c b/bfd/reloc16.c
index fb4c04d..3b4e483 100644
--- a/bfd/reloc16.c
+++ b/bfd/reloc16.c
@@ -292,10 +292,10 @@ bfd_coff_reloc16_get_relocated_section_contents
{
arelent **parent = reloc_vector;
arelent *reloc;
- unsigned int dst_address = 0;
- unsigned int src_address = 0;
- unsigned int run;
- unsigned int idx;
+ size_t dst_address = 0;
+ size_t src_address = 0;
+ size_t run;
+ size_t idx;
/* Find how long a run we can do. */
while (dst_address < link_order->size)
@@ -306,6 +306,15 @@ bfd_coff_reloc16_get_relocated_section_contents
/* Note that the relaxing didn't tie up the addresses in the
relocation, so we use the original address to work out the
run of non-relocated data. */
+ if (reloc->address > link_order->size
+ || reloc->address < src_address)
+ {
+ link_info->callbacks->einfo
+ /* xgettext:c-format */
+ (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
+ input_bfd, input_section, reloc);
+ goto error_return;
+ }
run = reloc->address - src_address;
parent++;
}
@@ -319,12 +328,11 @@ bfd_coff_reloc16_get_relocated_section_contents
data[dst_address++] = data[src_address++];
/* Now do the relocation. */
- if (reloc)
- {
- bfd_coff_reloc16_extra_cases (input_bfd, link_info, link_order,
- reloc, data, &src_address,
- &dst_address);
- }
+ if (reloc
+ && !bfd_coff_reloc16_extra_cases (input_bfd, link_info,
+ link_order, reloc, data,
+ &src_address, &dst_address))
+ goto error_return;
}
}
free (reloc_vector);