aboutsummaryrefslogtreecommitdiff
path: root/bfd/ecoff.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-10-06 17:31:31 +1030
committerAlan Modra <amodra@gmail.com>2021-10-06 18:00:00 +1030
commit1992e26ec4498bdd08fa960b449f6fa29e5759fa (patch)
tree49440bc552d0caffcc651333ac4a555157d1cc36 /bfd/ecoff.c
parent1808483c2f3f323d8e0398282251a85cd956321b (diff)
downloadgdb-1992e26ec4498bdd08fa960b449f6fa29e5759fa.zip
gdb-1992e26ec4498bdd08fa960b449f6fa29e5759fa.tar.gz
gdb-1992e26ec4498bdd08fa960b449f6fa29e5759fa.tar.bz2
PR28420, ecoff fuzzing failures
PR 28420 * coff-mips.c (mips_adjust_reloc_in): Replace abort with error message and return. * ecoff.c (ecoff_slurp_reloc_table): Remove assertion and aborts, instead handle errors gracefully.
Diffstat (limited to 'bfd/ecoff.c')
-rw-r--r--bfd/ecoff.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/bfd/ecoff.c b/bfd/ecoff.c
index 7844a50..7539fad 100644
--- a/bfd/ecoff.c
+++ b/bfd/ecoff.c
@@ -1606,23 +1606,20 @@ ecoff_slurp_reloc_table (bfd *abfd,
(*backend->swap_reloc_in) (abfd,
external_relocs + i * external_reloc_size,
&intern);
+ rptr->sym_ptr_ptr = NULL;
+ rptr->addend = 0;
if (intern.r_extern)
{
/* r_symndx is an index into the external symbols. */
- BFD_ASSERT (intern.r_symndx >= 0
- && (intern.r_symndx
- < (ecoff_data (abfd)
- ->debug_info.symbolic_header.iextMax)));
- rptr->sym_ptr_ptr = symbols + intern.r_symndx;
- rptr->addend = 0;
+ if (intern.r_symndx >= 0
+ && (intern.r_symndx
+ < (ecoff_data (abfd)->debug_info.symbolic_header.iextMax)))
+ rptr->sym_ptr_ptr = symbols + intern.r_symndx;
}
else if (intern.r_symndx == RELOC_SECTION_NONE
|| intern.r_symndx == RELOC_SECTION_ABS)
- {
- rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
- rptr->addend = 0;
- }
+ rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
else
{
const char *sec_name;
@@ -1645,15 +1642,20 @@ ecoff_slurp_reloc_table (bfd *abfd,
case RELOC_SECTION_FINI: sec_name = _FINI; break;
case RELOC_SECTION_LITA: sec_name = _LITA; break;
case RELOC_SECTION_RCONST: sec_name = _RCONST; break;
- default: abort ();
+ default:
+ sec_name = NULL;
+ break;
}
- sec = bfd_get_section_by_name (abfd, sec_name);
- if (sec == NULL)
- abort ();
- rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
-
- rptr->addend = - bfd_section_vma (sec);
+ if (sec_name != NULL)
+ {
+ sec = bfd_get_section_by_name (abfd, sec_name);
+ if (sec != NULL)
+ {
+ rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
+ rptr->addend = - bfd_section_vma (sec);
+ }
+ }
}
rptr->address = intern.r_vaddr - bfd_section_vma (section);