[PATCH] Reject compressed sections exceding 4 GiB on LLP64 machines

Rui Ueyama ruiu@cs.stanford.edu
Tue Jun 3 02:16:02 GMT 2025


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 | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/bfd/compress.c b/bfd/compress.c
index 4f92455dbd6..99b24f7368e 100644
--- a/bfd/compress.c
+++ b/bfd/compress.c
@@ -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,15 @@ 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_zstd
+      && (sec->size >= ULONG_MAX || uncompressed_size >= ULONG_MAX))
+    {
+      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);
-- 
2.43.0



More information about the Binutils mailing list