Fixes done to TLS.
[deliverable/binutils-gdb.git] / bfd / elfcode.h
index a49a7088ebbd9156b4af5cd40359bf45be122c02..79a14f3e3342e81860e8f5dda5de0972c4c42fcf 100644 (file)
@@ -1,5 +1,5 @@
 /* ELF executable support for BFD.
-   Copyright (C) 1991-2014 Free Software Foundation, Inc.
+   Copyright (C) 1991-2016 Free Software Foundation, Inc.
 
    Written by Fred Fish @ Cygnus Support, from information published
    in "UNIX System V Release 4, Programmers Guide: ANSI C and
@@ -605,13 +605,10 @@ elf_object_p (bfd *abfd)
 
   if (i_ehdrp->e_shoff != 0)
     {
-      bfd_signed_vma where = i_ehdrp->e_shoff;
-
-      if (where != (file_ptr) where)
-       goto got_wrong_format_error;
+      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
 
       /* Seek to the section header table in the file.  */
-      if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
+      if (bfd_seek (abfd, where, SEEK_SET) != 0)
        goto got_no_match;
 
       /* Read the first section header at index 0, and convert to internal
@@ -657,19 +654,17 @@ elf_object_p (bfd *abfd)
            goto got_wrong_format_error;
 
          where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
-         if (where != (file_ptr) where)
-           goto got_wrong_format_error;
          if ((bfd_size_type) where <= i_ehdrp->e_shoff)
            goto got_wrong_format_error;
 
-         if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
+         if (bfd_seek (abfd, where, SEEK_SET) != 0)
            goto got_no_match;
          if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
            goto got_no_match;
 
          /* Back to where we were.  */
          where = i_ehdrp->e_shoff + sizeof (x_shdr);
-         if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
+         if (bfd_seek (abfd, where, SEEK_SET) != 0)
            goto got_no_match;
        }
     }
@@ -681,6 +676,10 @@ elf_object_p (bfd *abfd)
       Elf_Internal_Shdr *shdrp;
       unsigned int num_sec;
 
+#ifndef BFD64
+      if (i_ehdrp->e_shnum > ((bfd_size_type) -1) / sizeof (*i_shdrp))
+       goto got_wrong_format_error;
+#endif
       amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
       i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
       if (!i_shdrp)
@@ -712,7 +711,7 @@ elf_object_p (bfd *abfd)
              switch (ebd->elf_machine_code)
                {
                case EM_386:
-               case EM_486:
+               case EM_IAMCU:
                case EM_X86_64:
                case EM_OLD_SPARCV9:
                case EM_SPARC32PLUS:
@@ -771,7 +770,11 @@ elf_object_p (bfd *abfd)
       Elf_Internal_Phdr *i_phdr;
       unsigned int i;
 
-      amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
+#ifndef BFD64
+      if (i_ehdrp->e_phnum > ((bfd_size_type) -1) / sizeof (*i_phdr))
+       goto got_wrong_format_error;
+#endif
+      amt = i_ehdrp->e_phnum * sizeof (*i_phdr);
       elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
       if (elf_tdata (abfd)->phdr == NULL)
        goto got_no_match;
@@ -1214,10 +1217,9 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
       for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
        {
          memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
-         sym->symbol.the_bfd = abfd;
 
+         sym->symbol.the_bfd = abfd;
          sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
-
          sym->symbol.value = isym->st_value;
 
          if (isym->st_shndx == SHN_UNDEF)
@@ -1300,6 +1302,7 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
            case STT_COMMON:
              /* FIXME: Do we have to put the size field into the value field
                 as we do with symbols in SHN_COMMON sections (see above) ?  */
+             sym->symbol.flags |= BSF_ELF_COMMON;
              /* Fall through.  */
            case STT_OBJECT:
              sym->symbol.flags |= BSF_OBJECT;
@@ -1501,7 +1504,9 @@ elf_slurp_reloc_table (bfd *abfd,
       rel_hdr2 = d->rela.hdr;
       reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
 
-      BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
+      /* PR 17512: file: 0b4f81b7.  */
+      if (asect->reloc_count != reloc_count + reloc_count2)
+       return FALSE;
       BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
                  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
 
@@ -1749,7 +1754,7 @@ NAME(_bfd_elf,bfd_from_remote_memory)
             headers.  */
        }
       else if (size >= shdr_end)
-       high_offset = shdr_end;
+       high_offset = size;
       else
        {
          bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;
This page took 0.040338 seconds and 4 git commands to generate.