diff options
Diffstat (limited to 'libarchive/archive_write_add_filter_gzip.c')
-rw-r--r-- | libarchive/archive_write_add_filter_gzip.c | 41 |
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 |