From d24e79e8f9547ae475a3a0c9516e079a14010838 Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Fri, 13 Feb 2015 20:20:15 -0800 Subject: [PATCH] Issue 409: archive_read_extract object leaked Register the cleanup function for the object at the point where the object is actually allocated to ensure that it always gets cleaned up. --- libarchive/archive_read_extract.c | 17 ----------------- libarchive/archive_read_extract2.c | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/libarchive/archive_read_extract.c b/libarchive/archive_read_extract.c index ce76a6cad..b7973fa8e 100644 --- a/libarchive/archive_read_extract.c +++ b/libarchive/archive_read_extract.c @@ -35,8 +35,6 @@ __FBSDID("$FreeBSD: src/lib/libarchive/archive_read_extract.c,v 1.61 2008/05/26 #include "archive_private.h" #include "archive_read_private.h" -static int archive_read_extract_cleanup(struct archive_read *); - int archive_read_extract(struct archive *_a, struct archive_entry *entry, int flags) { @@ -55,23 +53,8 @@ archive_read_extract(struct archive *_a, struct archive_entry *entry, int flags) return (ARCHIVE_FATAL); } archive_write_disk_set_standard_lookup(extract->ad); - a->cleanup_archive_extract = archive_read_extract_cleanup; } archive_write_disk_set_options(extract->ad, flags); return (archive_read_extract2(&a->archive, entry, extract->ad)); } - -/* - * Cleanup function for archive_extract. - */ -static int -archive_read_extract_cleanup(struct archive_read *a) -{ - int ret = ARCHIVE_OK; - - ret = archive_write_free(a->extract->ad); - free(a->extract); - a->extract = NULL; - return (ret); -} diff --git a/libarchive/archive_read_extract2.c b/libarchive/archive_read_extract2.c index 68186a649..7b2c12631 100644 --- a/libarchive/archive_read_extract2.c +++ b/libarchive/archive_read_extract2.c @@ -42,6 +42,8 @@ __FBSDID("$FreeBSD: src/lib/libarchive/archive_read_extract.c,v 1.61 2008/05/26 #include "archive_read_private.h" static int copy_data(struct archive *ar, struct archive *aw); +static int archive_read_extract_cleanup(struct archive_read *); + /* Retrieve an extract object without initialising the associated * archive_write_disk object. @@ -56,10 +58,27 @@ __archive_read_get_extract(struct archive_read *a) return (NULL); } memset(a->extract, 0, sizeof(*a->extract)); + a->cleanup_archive_extract = archive_read_extract_cleanup; } return (a->extract); } +/* + * Cleanup function for archive_extract. + */ +static int +archive_read_extract_cleanup(struct archive_read *a) +{ + int ret = ARCHIVE_OK; + + if (a->extract->ad != NULL) { + ret = archive_write_free(a->extract->ad); + } + free(a->extract); + a->extract = NULL; + return (ret); +} + int archive_read_extract2(struct archive *_a, struct archive_entry *entry, struct archive *ad) -- 2.47.2