This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: binutils/14933: ar & ranlib generate truncated files on
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: binutils at sourceware dot org
- Cc: nickc at redhat dot com
- Date: Sun, 9 Dec 2012 09:34:08 -0800
- Subject: PATCH: binutils/14933: ar & ranlib generate truncated files on
32bit filesystem
Reply-To:
Hi,
This patch
http://sourceware.org/ml/binutils/2012-07/msg00044.html
doesn't properly check 4Gb indicies in bsd_write_armap. It has 2 problems:
1. It doesn't work with 32-bit file_ptr.
2. It returns error on indicies from 0x80000000 to 0xffffffff.
However, coff_write_armap change works fine. This patch applies the
same logic in bsd_write_armap. I think it is an obvious fix for trunk
and 2.23.
Thanks.
H.J.
---
2012-12-09 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/14933
* archive.c (bsd_write_armap): Properly check indicies bigger than
4Gb.
diff --git a/bfd/archive.c b/bfd/archive.c
index 8e8fd2d..2fdc8b9 100644
--- a/bfd/archive.c
+++ b/bfd/archive.c
@@ -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;