diff options
author | Martin Matuska <martin@matuska.org> | 2020-01-03 03:47:19 +0100 |
---|---|---|
committer | Martin Matuska <martin@matuska.org> | 2020-01-03 03:56:06 +0100 |
commit | 5e270715b51d199467195b56f77e21cb8bb1d642 (patch) | |
tree | 5a321a59bf3ee3c9b6dd4bcf299ff5bdaa7759e3 /libarchive/archive_write.c | |
parent | f96a71144b7725ca4a94d84bd27d7dca8c2f58d2 (diff) | |
download | libarchive-5e270715b51d199467195b56f77e21cb8bb1d642.tar.gz |
Implement archive_write_client_free()
Plugs memory leak of test_open_failure
Fixes #1302
Diffstat (limited to 'libarchive/archive_write.c')
-rw-r--r-- | libarchive/archive_write.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/libarchive/archive_write.c b/libarchive/archive_write.c index e7a973ae..afa26b8e 100644 --- a/libarchive/archive_write.c +++ b/libarchive/archive_write.c @@ -449,6 +449,30 @@ archive_write_client_write(struct archive_write_filter *f, } 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) { struct archive_write *a = (struct archive_write *)f->archive; @@ -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) { |