* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Don't segfault on
authorAlan Modra <amodra@gmail.com>
Thu, 21 May 2009 13:49:11 +0000 (13:49 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 21 May 2009 13:49:11 +0000 (13:49 +0000)
out of range .opd symbols.

bfd/ChangeLog
bfd/elf64-ppc.c

index 3b0e97b96ae8fdb75dda9da29c9676084401c007..50ef873301b74f85b2bddebb75e08376fdfdfc4c 100644 (file)
@@ -1,3 +1,8 @@
+2009-05-21  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Don't segfault on
+       out of range .opd symbols.
+
 2009-05-21  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        * coffgen.c (coff_print_symbol):  Use bfd_fprintf_vma, not
index ce82e1601523f292013715ce2e541894d286abf7..ae3c3b9f3c93b20e86d804e0004d613e9928ae2e 100644 (file)
@@ -3033,6 +3033,10 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
        {
          bfd_vma ent;
 
+         /* Ignore bogus symbols.  */
+         if (syms[i]->value > opd->size - 8)
+           continue;
+
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
            {
@@ -3126,6 +3130,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
        {
          bfd_vma ent;
 
+         if (syms[i]->value > opd->size - 8)
+           continue;
+
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
            {