]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Reject compressed sections exceding 4 GiB on LLP64 machines
authorRui Ueyama <ruiu@cs.stanford.edu>
Tue, 3 Jun 2025 02:16:02 +0000 (11:16 +0900)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 4 Jun 2025 06:24:39 +0000 (14:24 +0800)
According to the zlib FAQ (*1), zlib does not support compressed data
larger than 4 GiB when the compiler's long type is 32 bits. Therefore,
we need to report an error if a zlib-compressed debug section exceeds
4 GiB on LLP64 machines.

(*1) https://zlib.net/zlib_faq.html#faq32

Signed-off-by: Rui Ueyama <rui314@gmail.com>
bfd/compress.c

index 4f92455dbd6d281f4beab5208e31630596b6efb8..287883702101900d1cba8efa7ab0e4ad6e6a729c 100644 (file)
@@ -521,10 +521,8 @@ decompress_contents (bool is_zstd, bfd_byte *compressed_buffer,
      buffers concatenated together, so we uncompress in a loop.  */
   do
     {
-      uLongf dst_len = (uncompressed_size > ULONG_MAX ? ULONG_MAX
-                       : uncompressed_size);
-      uLong src_len = (compressed_size > ULONG_MAX ? ULONG_MAX
-                      : compressed_size);
+      uLongf dst_len = uncompressed_size;
+      uLong src_len = compressed_size;
       int rc = uncompress2 ((Bytef *) uncompressed_buffer, &dst_len,
                            (Bytef *) compressed_buffer, &src_len);
       if (rc != Z_OK)
@@ -1009,6 +1007,16 @@ bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec)
       return false;
     }
 
+  /* PR28530, reject sizes unsupported by decompress_contents. zlib
+     supports only up to 4 GiB input on machines whose long is 32 bits. */
+  if (ch_type == ch_compress_zlib
+      && (sec->size != (uLong) sec->size
+         || uncompressed_size != (uLongf) uncompressed_size))
+    {
+      bfd_set_error (bfd_error_nonrepresentable_section);
+      return false;
+    }
+
   sec->compressed_size = sec->size;
   sec->size = uncompressed_size;
   bfd_set_section_alignment (sec, uncompressed_alignment_power);