Properly check indicies bigger than 4Gb
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 9 Dec 2012 18:01:39 +0000 (18:01 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Sun, 9 Dec 2012 18:01:39 +0000 (18:01 +0000)
PR binutils/14933
* archive.c (bsd_write_armap): Properly check indicies bigger
than 4Gb.

bfd/ChangeLog
bfd/archive.c

index b8fb291935ea8b7cd44de1767be816b9149a110b..9b286cffe462f722dc5aaa9d22f61a5007710304 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-09  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/14933
+       * archive.c (bsd_write_armap): Properly check indicies bigger
+       than 4Gb.
+
 2012-12-07  Alan Modra  <amodra@gmail.com>
 
        PR ld/14926
index 8e8fd2de5ca75536a20f8c1c194c2d65ab879fb9..2fdc8b9ad930840030d61911390a5a5fd5d2010d 100644 (file)
@@ -2424,9 +2424,6 @@ bsd_write_armap (bfd *arch,
   unsigned int count;
   struct ar_hdr hdr;
   long uid, gid;
-  file_ptr max_first_real = 1;
-
-  max_first_real <<= 31;
 
   firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
 
@@ -2469,6 +2466,7 @@ bsd_write_armap (bfd *arch,
 
   for (count = 0; count < orl_count; count++)
     {
+      unsigned int offset;
       bfd_byte buf[BSD_SYMDEF_SIZE];
 
       if (map[count].u.abfd != last_elt)
@@ -2488,7 +2486,8 @@ bsd_write_armap (bfd *arch,
       /* The archive file format only has 4 bytes to store the offset
         of the member.  Check to make sure that firstreal has not grown
         too big.  */
-      if (firstreal >= max_first_real)
+      offset = (unsigned int) firstreal;
+      if (firstreal != (file_ptr) offset)
        {
          bfd_set_error (bfd_error_file_truncated);
          return FALSE;