]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix the filter close handling. Since the archive_read core
authorTim Kientzle <kientzle@gmail.com>
Wed, 7 Jan 2009 05:12:07 +0000 (00:12 -0500)
committerTim Kientzle <kientzle@gmail.com>
Wed, 7 Jan 2009 05:12:07 +0000 (00:12 -0500)
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

libarchive/archive_read.c
libarchive/archive_read_support_compression_bzip2.c
libarchive/archive_read_support_compression_compress.c
libarchive/archive_read_support_compression_gzip.c
libarchive/archive_read_support_compression_program.c

index 0214c5fe5b2988073583e4805fb8b7cd94f94f3b..4dc06b8b00e6424b777c28c025a205e1c20403a9 100644 (file)
@@ -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;
        }
 
index 57d079d516f7779e84e69d9f38d0e7a82f32f318..d1fa5a5718fed7ebceec1fc5171930e385a8f073 100644 (file)
@@ -336,7 +336,6 @@ bzip2_filter_close(struct archive_read_filter *self)
 
        free(state->out_block);
        free(state);
-       free(self);
        return (ARCHIVE_OK);
 }
 
index 85bc0701300dad40aa3fbc2406515df6d93c8d95..ccb8095f2c9d788b51178a30c9ff8f77d6febb96 100644 (file)
@@ -308,7 +308,6 @@ compress_filter_close(struct archive_read_filter *self)
 
        free(state->out_block);
        free(state);
-       free(self);
        return (ARCHIVE_OK);
 }
 
index eaf4149ec033c235ffb6800e33c22954948080ea..be3590e3e477278b47fb5af2209bb89717ac2e95 100644 (file)
@@ -455,7 +455,6 @@ gzip_filter_close(struct archive_read_filter *self)
 
        free(state->out_block);
        free(state);
-       free(self);
        return (ret);
 }
 
index 8e381da7f6fe169f7d69335d87dd88db854f4b1d..884b5493072be1af9f1bef93d45923c8e8e86a1a 100644 (file)
@@ -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);
 }