[PATCH] libelf: decompress: ensure zlib resource cleanup
Mark Wielaard
mark@klomp.org
Mon Mar 16 12:18:48 GMT 2020
Hi,
On Mon, Mar 16, 2020 at 01:05:26PM +0100, Mark Wielaard wrote:
> Thanks for looking into this so closely. I think it is best to just do
> as the example code does. Always call inflateEnd (), ignoring the
> return code and not care whether (in an error case) it might be called
> twice. And to make it consistent in this file. So:
>
> diff --git a/libelf/elf_compress.c b/libelf/elf_compress.c
> index 244467b5..32422edc 100644
> --- a/libelf/elf_compress.c
> +++ b/libelf/elf_compress.c
> @@ -197,7 +197,7 @@ __libelf_compress (Elf_Scn *scn, size_t hsize, int ei_data,
> }
> while (flush != Z_FINISH); /* More data blocks. */
>
> - zrc = deflateEnd (&z);
> + deflateEnd (&z);
> if (zrc != Z_OK)
> {
> __libelf_seterrno (ELF_E_COMPRESS_ERROR);
> @@ -251,8 +251,7 @@ __libelf_decompress (void *buf_in, size_t size_in, size_t size_out)
> }
> zrc = inflateReset (&z);
> }
> - if (likely (zrc == Z_OK))
> - zrc = inflateEnd (&z);
> + inflateEnd (&z);
>
> if (unlikely (zrc != Z_OK) || unlikely (z.avail_out != 0))
> {
Obviously, I didn't look that closely, because when you apply the
above it causes multiple testcase failures. Oops. Sorry, back to the
drawing board. I suspect the zrz = deflateEnd in the compress case is
different from inflateEnd in the decompress case...
Cheers,
Mark
More information about the Elfutils-devel
mailing list