aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2024-02-07 12:29:12 +1030
committerAlan Modra <amodra@gmail.com>2024-02-07 21:29:07 +1030
commitc33ea119b1a5cca79f9efc0a6d5603667954358d (patch)
treea47ce94882f1143149f85c94b916710cf0b1823a
parent3ef23ee92631014b6e72e63aa0d6ecc467392546 (diff)
downloadbinutils-c33ea119b1a5cca79f9efc0a6d5603667954358d.zip
binutils-c33ea119b1a5cca79f9efc0a6d5603667954358d.tar.gz
binutils-c33ea119b1a5cca79f9efc0a6d5603667954358d.tar.bz2
asan: NULL dereference in _bfd_mips_final_write_processing
Fuzzed object files can easily have unexpected section names. We don't want to segfault on objcopy of any file accepted by the mips object_p functions. For objcopy, an assertion that "sec" is non-NULL followed by deferencing "sec" is wrong. So too is asserting that the section name string starts with a particular prefix, and then blithely accessing past the assumed prefix. * elfxx-mips.c (_bfd_mips_final_write_processing): Replace assertions with conditionals. Don't bother testing for name non-NULL.
-rw-r--r--bfd/elfxx-mips.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 69dd714..b888e76 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -12529,22 +12529,24 @@ _bfd_mips_final_write_processing (bfd *abfd)
case SHT_MIPS_GPTAB:
BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
name = bfd_section_name ((*hdrpp)->bfd_section);
- BFD_ASSERT (name != NULL
- && startswith (name, ".gptab."));
- sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
- BFD_ASSERT (sec != NULL);
- (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
+ if (startswith (name, ".gptab."))
+ {
+ sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
+ if (sec != NULL)
+ (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
+ }
break;
case SHT_MIPS_CONTENT:
BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
name = bfd_section_name ((*hdrpp)->bfd_section);
- BFD_ASSERT (name != NULL
- && startswith (name, ".MIPS.content"));
- sec = bfd_get_section_by_name (abfd,
- name + sizeof ".MIPS.content" - 1);
- BFD_ASSERT (sec != NULL);
- (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
+ if (startswith (name, ".MIPS.content"))
+ {
+ sec = bfd_get_section_by_name (abfd,
+ name + sizeof ".MIPS.content" - 1);
+ if (sec != NULL)
+ (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
+ }
break;
case SHT_MIPS_SYMBOL_LIB:
@@ -12559,19 +12561,16 @@ _bfd_mips_final_write_processing (bfd *abfd)
case SHT_MIPS_EVENTS:
BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
name = bfd_section_name ((*hdrpp)->bfd_section);
- BFD_ASSERT (name != NULL);
if (startswith (name, ".MIPS.events"))
sec = bfd_get_section_by_name (abfd,
name + sizeof ".MIPS.events" - 1);
+ else if (startswith (name, ".MIPS.post_rel"))
+ sec = bfd_get_section_by_name (abfd,
+ name + sizeof ".MIPS.post_rel" - 1);
else
- {
- BFD_ASSERT (startswith (name, ".MIPS.post_rel"));
- sec = bfd_get_section_by_name (abfd,
- (name
- + sizeof ".MIPS.post_rel" - 1));
- }
- BFD_ASSERT (sec != NULL);
- (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
+ sec = NULL;
+ if (sec != NULL)
+ (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
break;
case SHT_MIPS_XHASH: