From: Michihiro NAKAJIMA Date: Sun, 6 Jul 2014 03:06:15 +0000 (+0900) Subject: Plug memory leaks which Clang Static Analyser pointed out. X-Git-Tag: v3.1.900a~263 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae086fb2635b8e89a7f0a9ce65b80b8c641576e0;p=thirdparty%2Flibarchive.git Plug memory leaks which Clang Static Analyser pointed out. --- diff --git a/libarchive/archive_read_support_format_xar.c b/libarchive/archive_read_support_format_xar.c index ba1be8d2f..f0e240c16 100644 --- a/libarchive/archive_read_support_format_xar.c +++ b/libarchive/archive_read_support_format_xar.c @@ -3192,9 +3192,8 @@ xml2_read_toc(struct archive_read *a) case XML_READER_TYPE_ELEMENT: empty = xmlTextReaderIsEmptyElement(reader); r = xml2_xmlattr_setup(a, &list, reader); - if (r != ARCHIVE_OK) - return (r); - r = xml_start(a, name, &list); + if (r == ARCHIVE_OK) + r = xml_start(a, name, &list); xmlattr_cleanup(&list); if (r != ARCHIVE_OK) return (r); diff --git a/libarchive/archive_util.c b/libarchive/archive_util.c index 3d92566b2..a6a485c65 100644 --- a/libarchive/archive_util.c +++ b/libarchive/archive_util.c @@ -566,8 +566,11 @@ archive_utility_string_sort_helper(char **strings, unsigned int n) { lesser_count++; tmp = (char **)realloc(lesser, lesser_count * sizeof(char *)); - if (!tmp) + if (!tmp) { + free(greater); + free(lesser); return (ARCHIVE_FATAL); + } lesser = tmp; lesser[lesser_count - 1] = strings[i]; } @@ -575,8 +578,11 @@ archive_utility_string_sort_helper(char **strings, unsigned int n) { greater_count++; tmp = (char **)realloc(greater, greater_count * sizeof(char *)); - if (!tmp) + if (!tmp) { + free(greater); + free(lesser); return (ARCHIVE_FATAL); + } greater = tmp; greater[greater_count - 1] = strings[i]; } diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c index 87f4f0e56..ab3bdace3 100644 --- a/libarchive/archive_write_disk_posix.c +++ b/libarchive/archive_write_disk_posix.c @@ -3384,6 +3384,7 @@ copy_xattrs(struct archive_write_disk *a, int tmpfd, int dffd) } for (xattr_i = 0; xattr_i < xattr_size; xattr_i += strlen(xattr_names + xattr_i) + 1) { + char *xattr_val_saved; ssize_t s; int f; @@ -3394,11 +3395,13 @@ copy_xattrs(struct archive_write_disk *a, int tmpfd, int dffd) ret = ARCHIVE_WARN; goto exit_xattr; } + xattr_val_saved = xattr_val; xattr_val = realloc(xattr_val, s); if (xattr_val == NULL) { archive_set_error(&a->archive, ENOMEM, "Failed to get metadata(xattr)"); ret = ARCHIVE_WARN; + free(xattr_val_saved); goto exit_xattr; } s = fgetxattr(tmpfd, xattr_names + xattr_i, xattr_val, s, 0, 0);