Properly check indicies bigger than 4Gb

PR binutils/14933
	* archive.c (bsd_write_armap): Properly check indicies bigger
	than 4Gb.
This commit is contained in:
H.J. Lu 2012-12-09 18:01:39 +00:00
parent 1b80a9fa75
commit 35f0d39652
2 changed files with 9 additions and 4 deletions

View 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

View 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;