]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Implement archive_write_client_free()
authorMartin Matuska <martin@matuska.org>
Fri, 3 Jan 2020 02:47:19 +0000 (03:47 +0100)
committerMartin Matuska <martin@matuska.org>
Fri, 3 Jan 2020 02:56:06 +0000 (03:56 +0100)
Plugs memory leak of test_open_failure
Fixes #1302

libarchive/archive_write.c

index e7a973ae41a70c71b84413f18d1499b6a1795d0f..afa26b8ea0ed883779f9b83653876c99a0b309f8 100644 (file)
@@ -448,6 +448,30 @@ archive_write_client_write(struct archive_write_filter *f,
        return (ARCHIVE_OK);
 }
 
+static int
+archive_write_client_free(struct archive_write_filter *f)
+{
+       struct archive_write *a = (struct archive_write *)f->archive;
+       struct archive_none *state = (struct archive_none *)f->data;
+
+       if (state != NULL) {
+               free(state->buffer);
+               free(state);
+               state = NULL;
+       }
+
+       a->client_data = NULL;
+       /* Clear passphrase. */
+       if (a->passphrase != NULL) {
+               memset(a->passphrase, 0, strlen(a->passphrase));
+               free(a->passphrase);
+               a->passphrase = NULL;
+       }
+
+       return (ARCHIVE_OK);
+}
+
+
 static int
 archive_write_client_close(struct archive_write_filter *f)
 {
@@ -484,17 +508,9 @@ archive_write_client_close(struct archive_write_filter *f)
        }
        if (a->client_closer)
                (*a->client_closer)(&a->archive, a->client_data);
-       free(state->buffer);
-       free(state);
+
        /* Clear the close handler myself not to be called again. */
        f->state = ARCHIVE_WRITE_FILTER_STATE_CLOSED;
-       a->client_data = NULL;
-       /* Clear passphrase. */
-       if (a->passphrase != NULL) {
-               memset(a->passphrase, 0, strlen(a->passphrase));
-               free(a->passphrase);
-               a->passphrase = NULL;
-       }
        return (ret);
 }
 
@@ -523,6 +539,7 @@ archive_write_open(struct archive *_a, void *client_data,
        client_filter->open = archive_write_client_open;
        client_filter->write = archive_write_client_write;
        client_filter->close = archive_write_client_close;
+       client_filter->free = archive_write_client_free;
 
        ret = __archive_write_filters_open(a);
        if (ret < ARCHIVE_WARN) {