From: Tim Kientzle Date: Wed, 7 Jan 2009 05:12:07 +0000 (-0500) Subject: Fix the filter close handling. Since the archive_read core X-Git-Tag: v2.7.0~457 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a12bfefd085631292ce59e787d0ee463fac58f1e;p=thirdparty%2Flibarchive.git Fix the filter close handling. Since the archive_read core creates the filter object, it should also free it. This also corrects a small memory leak in archive_read_support_compression_program. SVN-Revision: 393 --- diff --git a/libarchive/archive_read.c b/libarchive/archive_read.c index 0214c5fe5..4dc06b8b0 100644 --- a/libarchive/archive_read.c +++ b/libarchive/archive_read.c @@ -594,9 +594,13 @@ _archive_read_close(struct archive *_a) /* Clean up the filter pipeline. */ while (a->filter != NULL) { struct archive_read_filter *t = a->filter->upstream; - r1 = (a->filter->close)(a->filter); - if (r1 < r) - r = r1; + if (a->filter->close != NULL) { + r1 = (a->filter->close)(a->filter); + if (r1 < r) + r = r1; + } + free(a->filter->buffer); + free(a->filter); a->filter = t; } diff --git a/libarchive/archive_read_support_compression_bzip2.c b/libarchive/archive_read_support_compression_bzip2.c index 57d079d51..d1fa5a571 100644 --- a/libarchive/archive_read_support_compression_bzip2.c +++ b/libarchive/archive_read_support_compression_bzip2.c @@ -336,7 +336,6 @@ bzip2_filter_close(struct archive_read_filter *self) free(state->out_block); free(state); - free(self); return (ARCHIVE_OK); } diff --git a/libarchive/archive_read_support_compression_compress.c b/libarchive/archive_read_support_compression_compress.c index 85bc07013..ccb8095f2 100644 --- a/libarchive/archive_read_support_compression_compress.c +++ b/libarchive/archive_read_support_compression_compress.c @@ -308,7 +308,6 @@ compress_filter_close(struct archive_read_filter *self) free(state->out_block); free(state); - free(self); return (ARCHIVE_OK); } diff --git a/libarchive/archive_read_support_compression_gzip.c b/libarchive/archive_read_support_compression_gzip.c index eaf4149ec..be3590e3e 100644 --- a/libarchive/archive_read_support_compression_gzip.c +++ b/libarchive/archive_read_support_compression_gzip.c @@ -455,7 +455,6 @@ gzip_filter_close(struct archive_read_filter *self) free(state->out_block); free(state); - free(self); return (ret); } diff --git a/libarchive/archive_read_support_compression_program.c b/libarchive/archive_read_support_compression_program.c index 8e381da7f..884b54930 100644 --- a/libarchive/archive_read_support_compression_program.c +++ b/libarchive/archive_read_support_compression_program.c @@ -129,6 +129,8 @@ archive_read_support_compression_program(struct archive *_a, const char *cmd) static int program_bidder_free(struct archive_read_filter_bidder *self) { + struct program_bidder *state = (struct program_bidder *)self->data; + free(state->cmd); free(self->data); return (ARCHIVE_OK); }