From 9177e3d47783eddc6a69c0f9e76b52a14c26f6c8 Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Thu, 25 Dec 2008 09:31:49 -0500 Subject: [PATCH] Straighten out the close handling. archive_read_close() now walks the decompression filter list, invoking the close handler on each one. In particular, this means that the compress handler should not recursively invoke close on it's source. SVN-Revision: 282 --- libarchive/archive_read.c | 5 +++-- libarchive/archive_read_support_compression_compress.c | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libarchive/archive_read.c b/libarchive/archive_read.c index a36e0c5ed..a1f40238f 100644 --- a/libarchive/archive_read.c +++ b/libarchive/archive_read.c @@ -595,11 +595,12 @@ archive_read_close(struct archive *_a) /* TODO: Clean up the formatters. */ /* Clean up the stream pipeline. */ - if (a->source != NULL) { + while (a->source != NULL) { + struct archive_read_source *t = a->source->upstream; r1 = (a->source->close)(a->source); if (r1 < r) r = r1; - a->source = NULL; + a->source = t; } /* Release the reader objects. */ diff --git a/libarchive/archive_read_support_compression_compress.c b/libarchive/archive_read_support_compression_compress.c index 24567ae04..329173738 100644 --- a/libarchive/archive_read_support_compression_compress.c +++ b/libarchive/archive_read_support_compression_compress.c @@ -339,7 +339,6 @@ compress_source_close(struct archive_read_source *self) { struct private_data *state = (struct private_data *)self->data; - self->upstream->close(self->upstream); free(state->out_block); free(state); free(self); -- 2.47.3