From: Tobias Stoeckmann Date: Mon, 20 Apr 2026 17:07:48 +0000 (+0200) Subject: mtree: Always release digest memory X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2f22c574223b78bc51466571b55f8f9e3f4eb7f9;p=thirdparty%2Flibarchive.git mtree: Always release digest memory 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. --- diff --git a/libarchive/archive_write_set_format_mtree.c b/libarchive/archive_write_set_format_mtree.c index a4ffec895..01573f243 100644 --- a/libarchive/archive_write_set_format_mtree.c +++ b/libarchive/archive_write_set_format_mtree.c @@ -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;