diff options
author | Alan Modra <amodra@gmail.com> | 2023-03-07 22:21:28 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-03-08 11:24:50 +1030 |
commit | d64c8f7181fd21f90983f8d55369f6f9a2960c43 (patch) | |
tree | 2121d1b6c59faefb19dd040ebe4eb57929782f76 /bfd/reloc16.c | |
parent | b9ee26d9ca29b5f598772de9f78c3da21cfa6c1b (diff) | |
download | gdb-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.c | 28 |
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); |