From 7af5d5c4dda26ac36ee2ff42af8f39a10382cc41 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 18 Dec 2018 09:20:06 +1030 Subject: [PATCH] PR23980, assertion fail All of the backend relocate_section functions that interpret reloc numbers assuming the input file is of the expected type (ie. same as output or very similar) really ought to be checking input file type. Not many do, and those that do currently just assert. This patch replaces the assertion with a more graceful exit. PR 23980 * elf32-i386.c (elf_i386_relocate_section): Exit with wrong format error rather than asserting input file is as expected. * elf32-s390.c (elf_s390_relocate_section): Likewise. * elf32-sh.c (sh_elf_relocate_section): Likewise. * elf32-xtensa.c (elf_xtensa_relocate_section): Likewise. * elf64-ppc.c (ppc64_elf_relocate_section): Likewise. * elf64-s390.c (elf_s390_relocate_section): Likewise. * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise. * elf32-ppc.c (ppc_elf_relocate_section): Exit with wrong format error if input file is not ppc32 ELF. --- bfd/ChangeLog | 14 ++++++++++++++ bfd/elf32-i386.c | 6 +++++- bfd/elf32-ppc.c | 6 ++++++ bfd/elf32-s390.c | 6 +++++- bfd/elf32-sh.c | 6 +++++- bfd/elf32-xtensa.c | 6 +++++- bfd/elf64-ppc.c | 6 +++++- bfd/elf64-s390.c | 6 +++++- bfd/elf64-x86-64.c | 6 +++++- 9 files changed, 55 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f8e936f92b8..8fcdb59648b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2018-12-18 Alan Modra + + PR 23980 + * elf32-i386.c (elf_i386_relocate_section): Exit with wrong format + error rather than asserting input file is as expected. + * elf32-s390.c (elf_s390_relocate_section): Likewise. + * elf32-sh.c (sh_elf_relocate_section): Likewise. + * elf32-xtensa.c (elf_xtensa_relocate_section): Likewise. + * elf64-ppc.c (ppc64_elf_relocate_section): Likewise. + * elf64-s390.c (elf_s390_relocate_section): Likewise. + * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise. + * elf32-ppc.c (ppc_elf_relocate_section): Exit with wrong format + error if input file is not ppc32 ELF. + 2018-12-18 Alan Modra PR 23980 diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 177471777df..7fe6afb8cfc 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2028,7 +2028,11 @@ elf_i386_relocate_section (bfd *output_bfd, if (htab == NULL) return FALSE; - BFD_ASSERT (is_x86_elf (input_bfd, htab)); + if (!is_x86_elf (input_bfd, htab)) + { + bfd_set_error (bfd_error_wrong_format); + return FALSE; + } symtab_hdr = &elf_symtab_hdr (input_bfd); sym_hashes = elf_sym_hashes (input_bfd); diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 6b6043a0da5..2f699652363 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -7025,6 +7025,12 @@ ppc_elf_relocate_section (bfd *output_bfd, (bfd_link_relocatable (info)) ? " (relocatable)" : ""); #endif + if (!is_ppc_elf (input_bfd)) + { + bfd_set_error (bfd_error_wrong_format); + return FALSE; + } + got2 = bfd_get_section_by_name (input_bfd, ".got2"); /* Initialize howto table if not already done. */ diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 448c64dcfce..75db448e581 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -2165,7 +2165,11 @@ elf_s390_relocate_section (bfd *output_bfd, Elf_Internal_Rela *rel; Elf_Internal_Rela *relend; - BFD_ASSERT (is_s390_elf (input_bfd)); + if (!is_s390_elf (input_bfd)) + { + bfd_set_error (bfd_error_wrong_format); + return FALSE; + } htab = elf_s390_hash_table (info); symtab_hdr = &elf_symtab_hdr (input_bfd); diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index 1b391090d8e..bcfcec70d0a 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -3510,7 +3510,11 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, unsigned isec_segment, got_segment, plt_segment, check_segment[2]; bfd_boolean fdpic_p = FALSE; - BFD_ASSERT (is_sh_elf (input_bfd)); + if (!is_sh_elf (input_bfd)) + { + bfd_set_error (bfd_error_wrong_format); + return FALSE; + } htab = sh_elf_hash_table (info); if (htab != NULL) diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index de960cd3b8f..05db733862b 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -2459,7 +2459,11 @@ elf_xtensa_relocate_section (bfd *output_bfd, if (!xtensa_default_isa) xtensa_default_isa = xtensa_isa_init (0, 0); - BFD_ASSERT (is_xtensa_elf (input_bfd)); + if (!is_xtensa_elf (input_bfd)) + { + bfd_set_error (bfd_error_wrong_format); + return FALSE; + } htab = elf_xtensa_hash_table (info); if (htab == NULL) diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 31a3edfdae7..2f4cfaaf338 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -13360,7 +13360,11 @@ ppc64_elf_relocate_section (bfd *output_bfd, if (input_section->owner == htab->params->stub_bfd) return TRUE; - BFD_ASSERT (is_ppc64_elf (input_bfd)); + if (!is_ppc64_elf (input_bfd)) + { + bfd_set_error (bfd_error_wrong_format); + return FALSE; + } local_got_ents = elf_local_got_ents (input_bfd); TOCstart = elf_gp (output_bfd); diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index c2a2955b36b..b05df50f71e 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -2119,7 +2119,11 @@ elf_s390_relocate_section (bfd *output_bfd, Elf_Internal_Rela *rel; Elf_Internal_Rela *relend; - BFD_ASSERT (is_s390_elf (input_bfd)); + if (!is_s390_elf (input_bfd)) + { + bfd_set_error (bfd_error_wrong_format); + return FALSE; + } htab = elf_s390_hash_table (info); if (htab == NULL) diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 4dcab434788..8e886b00c48 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2389,7 +2389,11 @@ elf_x86_64_relocate_section (bfd *output_bfd, if (htab == NULL) return FALSE; - BFD_ASSERT (is_x86_elf (input_bfd, htab)); + if (!is_x86_elf (input_bfd, htab)) + { + bfd_set_error (bfd_error_wrong_format); + return FALSE; + } plt_entry_size = htab->plt.plt_entry_size; symtab_hdr = &elf_symtab_hdr (input_bfd); -- 2.30.2