summaryrefslogtreecommitdiff
path: root/libarchive/archive_write_add_filter_gzip.c
diff options
context:
space:
mode:
Diffstat (limited to 'libarchive/archive_write_add_filter_gzip.c')
-rw-r--r--libarchive/archive_write_add_filter_gzip.c41
1 files changed, 16 insertions, 25 deletions
diff --git a/libarchive/archive_write_add_filter_gzip.c b/libarchive/archive_write_add_filter_gzip.c
index 0499bd1f..23dabe53 100644
--- a/libarchive/archive_write_add_filter_gzip.c
+++ b/libarchive/archive_write_add_filter_gzip.c
@@ -254,24 +254,17 @@ archive_compressor_gzip_close(struct archive_write_filter *f)
{
unsigned char trailer[8];
struct private_data *data = (struct private_data *)f->data;
- int ret;
-
- ret = 0;
- if (data != NULL) {
- /* Finish compression cycle */
- ret = drive_compressor(f, data, 1);
- if (ret != ARCHIVE_OK)
- goto cleanup;
+ int ret, r1;
+ /* Finish compression cycle */
+ ret = drive_compressor(f, data, 1);
+ if (ret == ARCHIVE_OK) {
/* Write the last compressed data. */
ret = __archive_write_filter(f->next_filter,
data->compressed,
data->compressed_buffer_size - data->stream.avail_out);
- if (ret != ARCHIVE_OK) {
- ret = ARCHIVE_FATAL;
- goto cleanup;
- }
-
+ }
+ if (ret == ARCHIVE_OK) {
/* Build and write out 8-byte trailer. */
trailer[0] = (data->crc)&0xff;
trailer[1] = (data->crc >> 8)&0xff;
@@ -282,20 +275,18 @@ archive_compressor_gzip_close(struct archive_write_filter *f)
trailer[6] = (data->total_in >> 16)&0xff;
trailer[7] = (data->total_in >> 24)&0xff;
ret = __archive_write_filter(f->next_filter, trailer, 8);
- if (ret != ARCHIVE_OK)
- ret = ARCHIVE_FATAL;
+ }
- cleanup:
- switch (deflateEnd(&(data->stream))) {
- case Z_OK:
- break;
- default:
- archive_set_error(f->archive, ARCHIVE_ERRNO_MISC,
- "Failed to clean up compressor");
- ret = ARCHIVE_FATAL;
- }
+ switch (deflateEnd(&(data->stream))) {
+ case Z_OK:
+ break;
+ default:
+ archive_set_error(f->archive, ARCHIVE_ERRNO_MISC,
+ "Failed to clean up compressor");
+ ret = ARCHIVE_FATAL;
}
- return (ret);
+ r1 = __archive_write_close_filter(f->next_filter);
+ return (r1 < ret ? r1 : ret);
}
static int