From 83d59285d549dab64d1be496408c0e62f30030b4 Mon Sep 17 00:00:00 2001 From: Nick Alcock Date: Fri, 20 Nov 2020 13:34:04 +0000 Subject: [PATCH] objdump, readelf: Report errors from CTF archive iteration We were failing to report errors from ctf_archive_iter, which results in silent early termination if (for example) one CTF archive member in a .ctf section is corrupted and cannot be opened. Report the error in the usual fashion instead. binutils/ChangeLog 2020-11-20 Nick Alcock * objdump.c (dump_ctf): Report errors from ctf_archive_iter. * readelf.c (dump_section_as_ctf): Likewise. --- binutils/ChangeLog | 5 +++++ binutils/objdump.c | 7 ++++++- binutils/readelf.c | 8 ++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 8b7cba02859..6555615fbfe 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2020-11-20 Nick Alcock + + * objdump.c (dump_ctf): Report errors from ctf_archive_iter. + * readelf.c (dump_section_as_ctf): Likewise. + 2020-11-20 Nick Alcock * objdump.c (dump_ctf): Use ctf_dict_open, not diff --git a/binutils/objdump.c b/binutils/objdump.c index bf8234987f0..0d4092d4f3a 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -4203,7 +4203,12 @@ dump_ctf (bfd *abfd, const char *sect_name, const char *parent_name) printf (_("Contents of CTF section %s:\n"), sanitize_string (sect_name)); - ctf_archive_iter (ctfa, dump_ctf_archive_member, parent); + if ((err = ctf_archive_iter (ctfa, dump_ctf_archive_member, parent)) != 0) + { + dump_ctf_errs (NULL); + non_fatal (_("CTF archive member open failure: %s"), ctf_errmsg (err)); + bfd_fatal (bfd_get_filename (abfd)); + } ctf_dict_close (parent); ctf_close (ctfa); ctf_close (parenta); diff --git a/binutils/readelf.c b/binutils/readelf.c index a79f29548a1..4d484dbe5f7 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -14787,8 +14787,12 @@ dump_section_as_ctf (Elf_Internal_Shdr * section, Filedata * filedata) printf (_("\nDump of CTF section '%s':\n"), printable_section_name (filedata, section)); - if (ctf_archive_iter (ctfa, dump_ctf_archive_member, parent) != 0) - ret = FALSE; + if ((err = ctf_archive_iter (ctfa, dump_ctf_archive_member, parent)) != 0) + { + dump_ctf_errs (NULL); + error (_("CTF member open failure: %s\n"), ctf_errmsg (err)); + ret = FALSE; + } fail: ctf_dict_close (parent); -- 2.30.2