summaryrefslogtreecommitdiffstats
path: root/lib/libarchive
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2009-04-17 01:02:56 +0000
committerkientzle <kientzle@FreeBSD.org>2009-04-17 01:02:56 +0000
commita0fd30c50077ec522e4d3fbc956ebf953caed346 (patch)
tree4ef4b868debf249afac0887b803cd414f77c4cba /lib/libarchive
parentd64af012dd77b9c7e12b1f9ce4a50e2ecb65cf66 (diff)
downloadFreeBSD-src-a0fd30c50077ec522e4d3fbc956ebf953caed346.zip
FreeBSD-src-a0fd30c50077ec522e4d3fbc956ebf953caed346.tar.gz
Fix a memory leak: Release the current list of /set keywords
even when we exit on an error.
Diffstat (limited to 'lib/libarchive')
-rw-r--r--lib/libarchive/archive_read_support_format_mtree.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/libarchive/archive_read_support_format_mtree.c b/lib/libarchive/archive_read_support_format_mtree.c
index 3a58620..ba65ce0 100644
--- a/lib/libarchive/archive_read_support_format_mtree.c
+++ b/lib/libarchive/archive_read_support_format_mtree.c
@@ -404,10 +404,13 @@ read_mtree(struct archive_read *a, struct mtree *mtree)
len = readline(a, mtree, &p, 256);
if (len == 0) {
mtree->this_entry = mtree->entries;
+ free_options(global);
return (ARCHIVE_OK);
}
- if (len < 0)
+ if (len < 0) {
+ free_options(global);
return (len);
+ }
/* Leading whitespace is never significant, ignore it. */
while (*p == ' ' || *p == '\t') {
++p;
@@ -432,13 +435,16 @@ read_mtree(struct archive_read *a, struct mtree *mtree)
} else
break;
- if (r != ARCHIVE_OK)
+ if (r != ARCHIVE_OK) {
+ free_options(global);
return r;
+ }
}
archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
"Can't parse line %ju", counter);
- return ARCHIVE_FATAL;
+ free_options(global);
+ return (ARCHIVE_FATAL);
}
/*
OpenPOWER on IntegriCloud