]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
asan: buffer overflow in elfnn-aarch64.c get_plt_type
authorAlan Modra <amodra@gmail.com>
Fri, 17 Dec 2021 01:49:54 +0000 (12:19 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 17 Dec 2021 05:31:13 +0000 (16:01 +1030)
We can't assume .dynamic is a multiple of ElfNN_External_Dyn, at least
not when presented with fuzzed object files.

* elfnn-aarch64.c (get_plt_type): Don't access past end of
improperly sized .dynamic.

bfd/elfnn-aarch64.c

index 4885f417a2a46b37007c5517af20e080cbe1ff9d..051aff5c1b0e3efa633427239fdf64710ed438a6 100644 (file)
@@ -9762,11 +9762,13 @@ get_plt_type (bfd *abfd)
   aarch64_plt_type ret = PLT_NORMAL;
   bfd_byte *contents, *extdyn, *extdynend;
   asection *sec = bfd_get_section_by_name (abfd, ".dynamic");
-  if (!sec || !bfd_malloc_and_get_section (abfd, sec, &contents))
+  if (!sec
+      || sec->size < sizeof (ElfNN_External_Dyn)
+      || !bfd_malloc_and_get_section (abfd, sec, &contents))
     return ret;
   extdyn = contents;
-  extdynend = contents + sec->size;
-  for (; extdyn < extdynend; extdyn += sizeof (ElfNN_External_Dyn))
+  extdynend = contents + sec->size - sizeof (ElfNN_External_Dyn);
+  for (; extdyn <= extdynend; extdyn += sizeof (ElfNN_External_Dyn))
     {
       Elf_Internal_Dyn dyn;
       bfd_elfNN_swap_dyn_in (abfd, extdyn, &dyn);