This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Error when 32-bit ar tries to handle 4G or larger files


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=21d0a60620b306d6471ddedff04ac23912596cc6

commit 21d0a60620b306d6471ddedff04ac23912596cc6
Author: Alan Modra <amodra@gmail.com>
Date:   Fri Sep 15 10:22:13 2017 +0930

    Error when 32-bit ar tries to handle 4G or larger files
    
    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.

Diff:
---
 bfd/ChangeLog | 6 ++++++
 bfd/archive.c | 6 ++++++
 2 files changed, 12 insertions(+)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e4df74d..5f6b423 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/archive.c b/bfd/archive.c
index 885bf48..3ce3f9e 100644
--- a/bfd/archive.c
+++ b/bfd/archive.c
@@ -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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]