]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Merge pull request #2664 from fedegiova/fix_leak_for_cb_error
authorTim Kientzle <kientzle@acm.org>
Sun, 29 Jun 2025 02:15:32 +0000 (19:15 -0700)
committerMartin Matuska <martin@matuska.de>
Wed, 10 Sep 2025 08:18:13 +0000 (10:18 +0200)
Fix a memory leak if write callback error early

(cherry picked from commit 595fb29e4cf7cfd43bce0dfce7547cbcdfbd077b)

libarchive/archive_write_set_format_zip.c

index ee69a922c73f9121c3b9c6d85755f84f133f8ab4..79bbf0335e370f9b1a5366ba0030264a0d3bb532 100644 (file)
@@ -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;