]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Issue 409: archive_read_extract object leaked
authorTim Kientzle <kientzle@acm.org>
Sat, 14 Feb 2015 04:20:15 +0000 (20:20 -0800)
committerTim Kientzle <kientzle@acm.org>
Sat, 14 Feb 2015 04:20:15 +0000 (20:20 -0800)
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
libarchive/archive_read_extract2.c

index ce76a6cadf8b54be704ec5a3fccc0421ff7f8c07..b7973fa8e0062bf1a0ee8d5ef7664dcb2a1899f4 100644 (file)
@@ -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);
-}
index 68186a649bf5940f5b8a50ed1f469acca2342ed2..7b2c12631dc76f9c7cd841685be9338bc21eff61 100644 (file)
@@ -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)