]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
XAR reader: implement checksum_cleanup() to avoid memory leaks on error
authorMartin Matuska <martin@matuska.org>
Mon, 6 Feb 2017 01:48:24 +0000 (02:48 +0100)
committerMartin Matuska <martin@matuska.org>
Mon, 6 Feb 2017 01:49:30 +0000 (02:49 +0100)
Reported-By: OSS-Fuzz issue 551

libarchive/archive_read_support_format_xar.c

index d3002af718cf2858d10b2dbd1f642dcb1987dc3c..7a22beb9d8e43ba913f6832ea74f8364a2a854a2 100644 (file)
@@ -394,6 +394,7 @@ static void checksum_update(struct archive_read *, const void *,
                    size_t, const void *, size_t);
 static int     checksum_final(struct archive_read *, const void *,
                    size_t, const void *, size_t);
+static void    checksum_cleanup(struct archive_read *);
 static int     decompression_init(struct archive_read *, enum enctype);
 static int     decompress(struct archive_read *, const void **,
                    size_t *, const void *, size_t *);
@@ -923,6 +924,7 @@ xar_cleanup(struct archive_read *a)
        int r;
 
        xar = (struct xar *)(a->format->data);
+       checksum_cleanup(a);
        r = decompression_cleanup(a);
        hdlink = xar->hdlink_list;
        while (hdlink != NULL) {
@@ -1719,6 +1721,16 @@ decompression_cleanup(struct archive_read *a)
        return (r);
 }
 
+static void
+checksum_cleanup(struct archive_read *a) {
+       struct xar *xar;
+
+       xar = (struct xar *)(a->format->data);
+
+       _checksum_final(&(xar->a_sumwrk), NULL, 0);
+       _checksum_final(&(xar->e_sumwrk), NULL, 0);
+}
+
 static void
 xmlattr_cleanup(struct xmlattr_list *list)
 {