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)
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);