]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix a memory leak if write callback error early 2664/head
authorFederico Giovanardi <federico.giovanardi@cnhind.com>
Tue, 3 Jun 2025 16:24:35 +0000 (18:24 +0200)
committerFederico Giovanardi <federico.giovanardi@cnhind.com>
Tue, 3 Jun 2025 16:24:35 +0000 (18:24 +0200)
libarchive/archive_write_set_format_zip.c

index 3630b9f2b3a3ce91bd56afe8ce5198fd20b88290..528ec2dcebaed1409bbabedf068121c0420148b9 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;