Don't exceed reloc array bounds
authorAlan Modra <amodra@gmail.com>
Sat, 17 Mar 2018 07:19:12 +0000 (17:49 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 21 Mar 2018 11:12:17 +0000 (21:42 +1030)
* elf64-ppc.c (ppc64_elf_relocate_section): Don't access rel[1]
without first checking array bounds.
* elf32-ppc.c (ppc_elf_relocate_section): Likewise.

bfd/ChangeLog
bfd/elf32-ppc.c
bfd/elf64-ppc.c

index 1850d20..6846481 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-21  Alan Modra  <amodra@gmail.com>
+
+       * elf64-ppc.c (ppc64_elf_relocate_section): Don't access rel[1]
+       without first checking array bounds.
+       * elf32-ppc.c (ppc_elf_relocate_section): Likewise.
+
 2018-03-20  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/22983
index 66bbf0d..182dc2a 100644 (file)
@@ -8000,7 +8000,8 @@ ppc_elf_relocate_section (bfd *output_bfd,
          break;
 
        case R_PPC_TLSGD:
-         if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
+         if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
+             && rel + 1 < relend)
            {
              unsigned int insn2;
              bfd_vma offset = rel->r_offset;
@@ -8027,7 +8028,8 @@ ppc_elf_relocate_section (bfd *output_bfd,
          break;
 
        case R_PPC_TLSLD:
-         if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
+         if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
+             && rel + 1 < relend)
            {
              unsigned int insn2;
 
index 889bdb0..7155aeb 100644 (file)
@@ -13897,7 +13897,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
          break;
 
        case R_PPC64_TLSGD:
-         if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
+         if (tls_mask != 0 && (tls_mask & TLS_GD) == 0
+             && rel + 1 < relend)
            {
              unsigned int insn2;
              bfd_vma offset = rel->r_offset;
@@ -13931,7 +13932,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
          break;
 
        case R_PPC64_TLSLD:
-         if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
+         if (tls_mask != 0 && (tls_mask & TLS_LD) == 0
+             && rel + 1 < relend)
            {
              unsigned int insn2;
              bfd_vma offset = rel->r_offset;