]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
mtree: Always release digest memory
authorTobias Stoeckmann <tobias@stoeckmann.org>
Mon, 20 Apr 2026 17:07:48 +0000 (19:07 +0200)
committerTobias Stoeckmann <tobias@stoeckmann.org>
Mon, 20 Apr 2026 18:12:15 +0000 (20:12 +0200)
If a checksum has been provided through archive_entry and no data is
written, then digest internal memory is not released.

Fix this by always calling final functions, even if result is not
needed.

libarchive/archive_write_set_format_mtree.c

index a4ffec8954d94f8e8b330906206931535b979df2..01573f243d7b5830888193ec0bb5f73e980c9a1a 100644 (file)
@@ -1611,6 +1611,7 @@ sum_update(struct mtree_writer *mtree, const void *buff, size_t n)
 static void
 sum_final(struct mtree_writer *mtree, struct reg_info *reg)
 {
+       struct ae_digest digest;
 
        if (mtree->compute_sum & F_CKSUM) {
                uint64_t len;
@@ -1620,40 +1621,34 @@ sum_final(struct mtree_writer *mtree, struct reg_info *reg)
                reg->crc = ~mtree->crc;
        }
 #ifdef ARCHIVE_HAS_MD5
-       if ((mtree->compute_sum & F_MD5)
-               && !(reg->mset_digest & AE_MSET_DIGEST_MD5))
+       if (mtree->compute_sum & F_MD5)
 
-               archive_md5_final(&mtree->md5ctx, reg->digest.md5);
+               archive_md5_final(&mtree->md5ctx, (reg->mset_digest & AE_MSET_DIGEST_MD5) ? digest.md5 : reg->digest.md5);
 #endif
 #ifdef ARCHIVE_HAS_RMD160
-       if ((mtree->compute_sum & F_RMD160)
-               && !(reg->mset_digest & AE_MSET_DIGEST_RMD160))
+       if (mtree->compute_sum & F_RMD160)
 
-               archive_rmd160_final(&mtree->rmd160ctx, reg->digest.rmd160);
+               archive_rmd160_final(&mtree->rmd160ctx, (reg->mset_digest & AE_MSET_DIGEST_RMD160) ? digest.rmd160 : reg->digest.rmd160);
 #endif
 #ifdef ARCHIVE_HAS_SHA1
-       if ((mtree->compute_sum & F_SHA1)
-               && !(reg->mset_digest & AE_MSET_DIGEST_SHA1))
+       if (mtree->compute_sum & F_SHA1)
 
-               archive_sha1_final(&mtree->sha1ctx, reg->digest.sha1);
+               archive_sha1_final(&mtree->sha1ctx, (reg->mset_digest & AE_MSET_DIGEST_SHA1) ? digest.sha1 : reg->digest.sha1);
 #endif
 #ifdef ARCHIVE_HAS_SHA256
-       if ((mtree->compute_sum & F_SHA256)
-               && !(reg->mset_digest & AE_MSET_DIGEST_SHA256))
+       if (mtree->compute_sum & F_SHA256)
 
-               archive_sha256_final(&mtree->sha256ctx, reg->digest.sha256);
+               archive_sha256_final(&mtree->sha256ctx, (reg->mset_digest & AE_MSET_DIGEST_SHA256) ? digest.sha256 : reg->digest.sha256);
 #endif
 #ifdef ARCHIVE_HAS_SHA384
-       if ((mtree->compute_sum & F_SHA384)
-               && !(reg->mset_digest & AE_MSET_DIGEST_SHA384))
+       if (mtree->compute_sum & F_SHA384)
 
-               archive_sha384_final(&mtree->sha384ctx, reg->digest.sha384);
+               archive_sha384_final(&mtree->sha384ctx, (reg->mset_digest & AE_MSET_DIGEST_SHA384) ? digest.sha384 : reg->digest.sha384);
 #endif
 #ifdef ARCHIVE_HAS_SHA512
-       if ((mtree->compute_sum & F_SHA512)
-               && !(reg->mset_digest & AE_MSET_DIGEST_SHA512))
+       if (mtree->compute_sum & F_SHA512)
 
-               archive_sha512_final(&mtree->sha512ctx, reg->digest.sha512);
+               archive_sha512_final(&mtree->sha512ctx, (reg->mset_digest & AE_MSET_DIGEST_SHA512) ? digest.sha512 : reg->digest.sha512);
 #endif
        /* Save what types of sum are computed. */
        reg->compute_sum = mtree->compute_sum;