From 0f78c4d73217122871918c0b883b7150262b4cac Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 9 Dec 2012 18:06:44 +0000 Subject: [PATCH] Properly check indicies bigger than 4Gb PR binutils/14933 * archive.c (bsd_write_armap): Properly check indicies bigger than 4Gb. --- bfd/ChangeLog | 6 ++++++ bfd/archive.c | 7 +++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 28b27d30f0d..235a7538bd3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2012-12-09 H.J. Lu + + PR binutils/14933 + * archive.c (bsd_write_armap): Properly check indicies bigger than + 4Gb. + 2012-11-29 Roland McGrath * elf-nacl.c (segment_eligible_for_headers): Disallow writable segments. diff --git a/bfd/archive.c b/bfd/archive.c index fe57755770b..5814b460976 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -2408,9 +2408,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; @@ -2453,6 +2450,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) @@ -2472,7 +2470,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; -- 2.47.3