Error when 32-bit ar tries to handle 4G or larger files
authorAlan Modra <amodra@gmail.com>
Fri, 15 Sep 2017 00:52:13 +0000 (10:22 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 15 Sep 2017 01:06:40 +0000 (10:36 +0930)
We used to silently truncate the size returned by stat() to 32 bits.
While it is possible to make binutils handle a 64-bit off_t on a
32-bit host, to me the effort needed doesn't seem worth the benefit.
Instead, error if we truncate the size.  I've written the test the way
I have to avoid a signed/unsigned warning.

PR 22116
* archive.c (bfd_ar_hdr_from_filesystem): Detect when status.st_size
overflows bfd_size_type.

bfd/ChangeLog
bfd/archive.c

index e4df74d3318b5c188d7add71b67fe69c77ce39cf..5f6b4235ee8a3a01d125d732b911b09fbd013666 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-15  Alan Modra  <amodra@gmail.com>
+
+       PR 22116
+       * archive.c (bfd_ar_hdr_from_filesystem): Detect when status.st_size
+       overflows bfd_size_type.
+
 2017-09-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/22135
index 885bf489c024a7a24444bb82740987dd20aff184..3ce3f9eb892ce8e28b51f66a09855f868d7b2d6a 100644 (file)
@@ -1980,6 +1980,12 @@ bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member)
                      status.st_gid);
   _bfd_ar_spacepad (hdr->ar_mode, sizeof (hdr->ar_mode), "%-8lo",
                    status.st_mode);
+  if (status.st_size - (bfd_size_type) status.st_size != 0)
+    {
+      bfd_set_error (bfd_error_file_too_big);
+      free (ared);
+      return NULL;
+    }
   if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size), status.st_size))
     {
       free (ared);