From aa69d3431175dda32864f522db52c3f28783c6e3 Mon Sep 17 00:00:00 2001 From: Federico Giovanardi Date: Tue, 3 Jun 2025 18:24:35 +0200 Subject: [PATCH] Fix a memory leak if write callback error early --- libarchive/archive_write_set_format_zip.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libarchive/archive_write_set_format_zip.c b/libarchive/archive_write_set_format_zip.c index 3630b9f2b..528ec2dce 100644 --- a/libarchive/archive_write_set_format_zip.c +++ b/libarchive/archive_write_set_format_zip.c @@ -1856,7 +1856,10 @@ archive_write_zip_finish_entry(struct archive_write *a) } ret = __archive_write_output(a, zip->buf, remainder); if (ret != ARCHIVE_OK) + { + deflateEnd(&zip->stream.deflate); return (ret); + } zip->entry_compressed_written += remainder; zip->written_bytes += remainder; zip->stream.deflate.next_out = zip->buf; @@ -1898,7 +1901,10 @@ archive_write_zip_finish_entry(struct archive_write *a) } ret = __archive_write_output(a, zip->buf, remainder); if (ret != ARCHIVE_OK) + { + BZ2_bzCompressEnd(&zip->stream.bzip2); return (ret); + } zip->entry_compressed_written += remainder; zip->written_bytes += remainder; zip->stream.bzip2.next_out = (char*)zip->buf; @@ -1940,7 +1946,10 @@ archive_write_zip_finish_entry(struct archive_write *a) } ret = __archive_write_output(a, zip->buf, remainder); if (ret != ARCHIVE_OK) + { + ZSTD_freeCStream(zip->stream.zstd.context); return (ret); + } zip->entry_compressed_written += remainder; zip->written_bytes += remainder; zip->stream.zstd.out.dst = zip->buf; @@ -1984,7 +1993,10 @@ archive_write_zip_finish_entry(struct archive_write *a) } ret = __archive_write_output(a, zip->buf, remainder); if (ret != ARCHIVE_OK) + { + lzma_end(&zip->stream.lzma.context); return (ret); + } zip->entry_compressed_written += remainder; zip->written_bytes += remainder; zip->stream.lzma.context.next_out = zip->buf; -- 2.47.2