]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
decompress_contents: fuss over 32-bit long
authorAlan Modra <amodra@gmail.com>
Sun, 1 Jun 2025 03:37:58 +0000 (13:07 +0930)
committerAlan Modra <amodra@gmail.com>
Sun, 1 Jun 2025 03:51:00 +0000 (13:21 +0930)
Some 64-bit compilers have a 32-bit long, which could result in an
endless loop if uncompressed_size is larger than 4G.

bfd/compress.c

index b693204a3ea12a5230141f4d288d52a74f381311..4f92455dbd6d281f4beab5208e31630596b6efb8 100644 (file)
@@ -521,8 +521,10 @@ 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 src_len = compressed_size;
+      uLongf dst_len = (uncompressed_size > ULONG_MAX ? ULONG_MAX
+                       : uncompressed_size);
+      uLong src_len = (compressed_size > ULONG_MAX ? ULONG_MAX
+                      : compressed_size);
       int rc = uncompress2 ((Bytef *) uncompressed_buffer, &dst_len,
                            (Bytef *) compressed_buffer, &src_len);
       if (rc != Z_OK)