2008-02-22 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 23 Feb 2008 00:02:05 +0000 (00:02 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 23 Feb 2008 00:02:05 +0000 (00:02 +0000)
PR ld/5788
* elflink.c (elf_create_symbuf): Correct buffer size and
position.

bfd/ChangeLog
bfd/elflink.c

index 612a49017d6283200d4f113db724d54fa171a978..ea813ff50af9f6da7b11cfd1f01121ec7d100b09 100644 (file)
@@ -1,7 +1,13 @@
+2008-02-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/5788
+       * elflink.c (elf_create_symbuf): Correct buffer size and
+       position.
+
 2008-02-22  Nick Clifton  <nickc@redhat.com>
 
        PR 868
-       *dwarf2.c: Revert previous patch.  All of the allocate memory is
+       * dwarf2.c: Revert previous patch.  All of the allocate memory is
        on an obstack which will be freed at some other time.
        
 2008-02-20  Nick Clifton  <nickc@redhat.com>
index ab19be255a6518f66a96dedb75224d7522b2b685..3a00a51f765ba2463ba99d9b365c01118c82af40 100644 (file)
@@ -6870,7 +6870,7 @@ elf_create_symbuf (bfd_size_type symcount, Elf_Internal_Sym *isymbuf)
   Elf_Internal_Sym **ind, **indbufend, **indbuf;
   struct elf_symbuf_symbol *ssym;
   struct elf_symbuf_head *ssymbuf, *ssymhead;
-  bfd_size_type i, shndx_count;
+  bfd_size_type i, shndx_count, total_size;
 
   indbuf = bfd_malloc2 (symcount, sizeof (*indbuf));
   if (indbuf == NULL)
@@ -6890,15 +6890,16 @@ elf_create_symbuf (bfd_size_type symcount, Elf_Internal_Sym *isymbuf)
       if (ind[0]->st_shndx != ind[1]->st_shndx)
        shndx_count++;
 
-  ssymbuf = bfd_malloc ((shndx_count + 1) * sizeof (*ssymbuf)
-                       + (indbufend - indbuf) * sizeof (*ssymbuf));
+  total_size = ((shndx_count + 1) * sizeof (*ssymbuf)
+               + (indbufend - indbuf) * sizeof (*ssym));
+  ssymbuf = bfd_malloc (total_size);
   if (ssymbuf == NULL)
     {
       free (indbuf);
       return NULL;
     }
 
-  ssym = (struct elf_symbuf_symbol *) (ssymbuf + shndx_count);
+  ssym = (struct elf_symbuf_symbol *) (ssymbuf + shndx_count + 1);
   ssymbuf->ssym = NULL;
   ssymbuf->count = shndx_count;
   ssymbuf->st_shndx = 0;
@@ -6916,7 +6917,9 @@ elf_create_symbuf (bfd_size_type symcount, Elf_Internal_Sym *isymbuf)
       ssym->st_other = (*ind)->st_other;
       ssymhead->count++;
     }
-  BFD_ASSERT ((bfd_size_type) (ssymhead - ssymbuf) == shndx_count);
+  BFD_ASSERT ((bfd_size_type) (ssymhead - ssymbuf) == shndx_count
+             && (((bfd_hostptr_t) ssym - (bfd_hostptr_t) ssymbuf)
+                 == total_size));
 
   free (indbuf);
   return ssymbuf;