PR26539, memory leak in inflate.c

H.J. Lu hjl.tools@gmail.com
Sun Jan 24 19:48:08 GMT 2021


On Fri, Jan 15, 2021 at 4:34 PM Alan Modra via Binutils
<binutils@sourceware.org> wrote:
>
> On Sat, Jan 16, 2021 at 08:47:24AM +1030, Alan Modra wrote:
> > I guess it would have been nicer to write the following
> >
> >   if (inflateEnd (& strm) != Z_OK
> >       || rc != Z_OK
> >       || strm.avail_out != 0)
> >     goto fail;
>
> So let's do that.
>
> bfd/
>         * compress.c (decompress_contents): Tidy inflateEnd result test.
> binutils/
>         * readelf.c (uncompress_section_contents): Tidy inflateEnd result test.
>
> diff --git a/bfd/compress.c b/bfd/compress.c
> index 4cd9b2e673..2e73c760e7 100644
> --- a/bfd/compress.c
> +++ b/bfd/compress.c
> @@ -60,8 +60,7 @@ decompress_contents (bfd_byte *compressed_buffer,
>         break;
>        rc = inflateReset (&strm);
>      }
> -  rc |= inflateEnd (&strm);
> -  return rc == Z_OK && strm.avail_out == 0;
> +  return inflateEnd (&strm) == Z_OK && rc == Z_OK && strm.avail_out == 0;
>  }

inflate has

   if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
        ret = Z_BUF_ERROR;

and it returns Z_BUF_ERROR at the end:

1272     if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
(gdb) p in
$71 = 1428
(gdb) p out
$72 = 4738
(gdb) p flush
$73 = 4
(gdb) p ret
$74 = 0
(gdb)

Checking  rc == Z_OK after inflateEnd (&strm) == Z_OK looks odd.

>  /* Compress data of the size specified in @var{uncompressed_size}
> diff --git a/binutils/readelf.c b/binutils/readelf.c
> index d828d5636d..5df5108622 100644
> --- a/binutils/readelf.c
> +++ b/binutils/readelf.c
> @@ -14229,8 +14229,8 @@ uncompress_section_contents (unsigned char **   buffer,
>          break;
>        rc = inflateReset (& strm);
>      }
> -  rc |= inflateEnd (& strm);
> -  if (rc != Z_OK
> +  if (inflateEnd (& strm) != Z_OK
> +      || rc != Z_OK
>        || strm.avail_out != 0)
>      goto fail;
>
>
> --
> Alan Modra
> Australia Development Lab, IBM



-- 
H.J.


More information about the Binutils mailing list