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

H.J. Lu hjl.tools@gmail.com
Wed Jun 4 05:36:35 GMT 2025


On Wed, Jun 4, 2025 at 7:09 AM Alan Modra <amodra@gmail.com> wrote:
>
> On Tue, Jun 03, 2025 at 11:16:02AM +0900, Rui Ueyama wrote:
> > 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))
>
>   if (ch_type == ch_compress_zlib
>       && (sec-size != (uLong) sec->size
>           || uncompressed_size != (ulongF) uncompressed_size))
>
> Avoids the need to include limits.h, which I missed in my patch, and
> ought to be optimised away when the types are the same size.
> OK with that change.

I am checking in this patch to restore the build.

> > +    {
> > +      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
>
> --
> Alan Modra



-- 
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Reject-compressed-sections-exceding-4-GiB-on-LLP64-m.patch
Type: text/x-patch
Size: 1984 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20250604/da460ccd/attachment.bin>


More information about the Binutils mailing list