From 0e88bc1ecc11b0deb743c7000f98f73aa1917ad9 Mon Sep 17 00:00:00 2001 From: Nicholas Vinson Date: Tue, 13 May 2025 19:38:50 -0400 Subject: [PATCH] Replace struct ae_mset_digest with uint_least32_t Signed-off-by: Nicholas Vinson --- libarchive/archive_entry.c | 12 +-- libarchive/archive_entry_private.h | 17 ++--- libarchive/archive_write_set_format_mtree.c | 82 ++++++++++++++------- 3 files changed, 68 insertions(+), 43 deletions(-) diff --git a/libarchive/archive_entry.c b/libarchive/archive_entry.c index 7e7d51870..dc74430f8 100644 --- a/libarchive/archive_entry.c +++ b/libarchive/archive_entry.c @@ -1607,27 +1607,27 @@ archive_entry_set_digest(struct archive_entry *entry, int type, switch (type) { case ARCHIVE_ENTRY_DIGEST_MD5: copy_digest(entry, md5, digest); - entry->mset_digest.md5 = 1; + entry->mset_digest |= AE_MSET_DIGEST_MD5; break; case ARCHIVE_ENTRY_DIGEST_RMD160: copy_digest(entry, rmd160, digest); - entry->mset_digest.rmd160 = 1; + entry->mset_digest |= AE_MSET_DIGEST_RMD160; break; case ARCHIVE_ENTRY_DIGEST_SHA1: copy_digest(entry, sha1, digest); - entry->mset_digest.sha1 = 1; + entry->mset_digest |= AE_MSET_DIGEST_SHA1; break; case ARCHIVE_ENTRY_DIGEST_SHA256: copy_digest(entry, sha256, digest); - entry->mset_digest.sha256 = 1; + entry->mset_digest |= AE_MSET_DIGEST_SHA256; break; case ARCHIVE_ENTRY_DIGEST_SHA384: copy_digest(entry, sha384, digest); - entry->mset_digest.sha384 = 1; + entry->mset_digest |= AE_MSET_DIGEST_SHA384; break; case ARCHIVE_ENTRY_DIGEST_SHA512: copy_digest(entry, sha512, digest); - entry->mset_digest.sha512 = 1; + entry->mset_digest |= AE_MSET_DIGEST_SHA512; break; default: return ARCHIVE_WARN; diff --git a/libarchive/archive_entry_private.h b/libarchive/archive_entry_private.h index 2af7b2b8c..9736f7716 100644 --- a/libarchive/archive_entry_private.h +++ b/libarchive/archive_entry_private.h @@ -48,15 +48,6 @@ struct ae_sparse { int64_t length; }; -struct ae_mset_digest { - char md5; - char rmd160; - char sha1; - char sha256; - char sha384; - char sha512; -}; - struct ae_digest { unsigned char md5[16]; unsigned char rmd160[20]; @@ -183,7 +174,13 @@ struct archive_entry { size_t mac_metadata_size; /* Digest support. */ - struct ae_mset_digest mset_digest; +#define AE_MSET_DIGEST_MD5 1 +#define AE_MSET_DIGEST_RMD160 2 +#define AE_MSET_DIGEST_SHA1 4 +#define AE_MSET_DIGEST_SHA256 8 +#define AE_MSET_DIGEST_SHA384 16 +#define AE_MSET_DIGEST_SHA512 32 + uint_least32_t mset_digest; struct ae_digest digest; /* ACL support. */ diff --git a/libarchive/archive_write_set_format_mtree.c b/libarchive/archive_write_set_format_mtree.c index b2767bfec..c2ecc4246 100644 --- a/libarchive/archive_write_set_format_mtree.c +++ b/libarchive/archive_write_set_format_mtree.c @@ -82,7 +82,7 @@ struct dir_info { struct reg_info { int compute_sum; uint32_t crc; - struct ae_mset_digest mset_digest; + uint_least32_t mset_digest; struct ae_digest digest; }; @@ -867,33 +867,43 @@ static void mtree_copy_ae_digests(struct reg_info *reg, struct archive_entry *entry, int compute_sum) { reg->compute_sum = compute_sum; - if ((reg->compute_sum & F_MD5) && entry->mset_digest.md5) { - memcpy(®->digest.md5, entry->digest.md5, sizeof(reg->digest.md5)); - reg->mset_digest.md5 = entry->mset_digest.md5; + reg->mset_digest = entry->mset_digest; + + if ((reg->compute_sum & F_MD5) + && (reg->mset_digest & AE_MSET_DIGEST_MD5)) { + + memcpy(®->digest.md5, entry->digest.md5, + sizeof(reg->digest.md5)); } - if (reg->compute_sum & F_RMD160 && entry->mset_digest.rmd160) { + if ((reg->compute_sum & F_RMD160) + && (reg->mset_digest & AE_MSET_DIGEST_RMD160)) { + memcpy(®->digest.rmd160, entry->digest.rmd160, sizeof(reg->digest.rmd160)); - reg->mset_digest.rmd160 = entry->mset_digest.rmd160; } - if (reg->compute_sum & F_SHA1 && entry->mset_digest.sha1) { - memcpy(®->digest.sha1, entry->digest.sha1, sizeof(reg->digest.sha1)); - reg->mset_digest.sha1 = entry->mset_digest.sha1; + if ((reg->compute_sum & F_SHA1) + && (reg->mset_digest & AE_MSET_DIGEST_SHA1)) { + + memcpy(®->digest.sha1, entry->digest.sha1, + sizeof(reg->digest.sha1)); } - if (reg->compute_sum & F_SHA256 && entry->mset_digest.sha256) { + if ((reg->compute_sum & F_SHA256) + && (reg->mset_digest & AE_MSET_DIGEST_SHA256)) { + memcpy(®->digest.sha256, entry->digest.sha256, sizeof(reg->digest.sha256)); - reg->mset_digest.sha256 = entry->mset_digest.sha256; } - if (reg->compute_sum & F_SHA384 && entry->mset_digest.sha384) { + if ((reg->compute_sum & F_SHA384) + && (reg->mset_digest & AE_MSET_DIGEST_SHA384)) { + memcpy(®->digest.sha384, entry->digest.sha384, sizeof(reg->digest.sha384)); - reg->mset_digest.sha384 = entry->mset_digest.sha384; } - if (reg->compute_sum & F_SHA512 && entry->mset_digest.sha512) { + if ((reg->compute_sum & F_SHA512) + && (reg->mset_digest & AE_MSET_DIGEST_SHA512)) { + memcpy(®->digest.sha512, entry->digest.sha512, sizeof(reg->digest.sha512)); - reg->mset_digest.sha512 = entry->mset_digest.sha512; } } @@ -1557,37 +1567,43 @@ sum_update(struct mtree_writer *mtree, const void *buff, size_t n) #ifdef ARCHIVE_HAS_MD5 if (mtree->compute_sum & F_MD5) { archive_md5_update(&mtree->md5ctx, buff, n); - mtree->mtree_entry->reg_info->mset_digest.md5 = 0; + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_MD5; } #endif #ifdef ARCHIVE_HAS_RMD160 if (mtree->compute_sum & F_RMD160) { archive_rmd160_update(&mtree->rmd160ctx, buff, n); - mtree->mtree_entry->reg_info->mset_digest.rmd160 = 0; + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_RMD160; } #endif #ifdef ARCHIVE_HAS_SHA1 if (mtree->compute_sum & F_SHA1) { archive_sha1_update(&mtree->sha1ctx, buff, n); - mtree->mtree_entry->reg_info->mset_digest.sha1 = 0; + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_SHA1; } #endif #ifdef ARCHIVE_HAS_SHA256 if (mtree->compute_sum & F_SHA256) { archive_sha256_update(&mtree->sha256ctx, buff, n); - mtree->mtree_entry->reg_info->mset_digest.sha256 = 0; + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_SHA256; } #endif #ifdef ARCHIVE_HAS_SHA384 if (mtree->compute_sum & F_SHA384) { archive_sha384_update(&mtree->sha384ctx, buff, n); - mtree->mtree_entry->reg_info->mset_digest.sha384 = 0; + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_SHA384; } #endif #ifdef ARCHIVE_HAS_SHA512 if (mtree->compute_sum & F_SHA512) { archive_sha512_update(&mtree->sha512ctx, buff, n); - mtree->mtree_entry->reg_info->mset_digest.sha512 = 0; + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_SHA512; } #endif } @@ -1604,27 +1620,39 @@ 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.md5) + if ((mtree->compute_sum & F_MD5) + && !(reg->mset_digest & AE_MSET_DIGEST_MD5)) + archive_md5_final(&mtree->md5ctx, reg->digest.md5); #endif #ifdef ARCHIVE_HAS_RMD160 - if (mtree->compute_sum & F_RMD160 && !reg->mset_digest.rmd160) + if ((mtree->compute_sum & F_RMD160) + && !(reg->mset_digest & AE_MSET_DIGEST_RMD160)) + archive_rmd160_final(&mtree->rmd160ctx, reg->digest.rmd160); #endif #ifdef ARCHIVE_HAS_SHA1 - if (mtree->compute_sum & F_SHA1 && !reg->mset_digest.sha1) + if ((mtree->compute_sum & F_SHA1) + && !(reg->mset_digest & AE_MSET_DIGEST_SHA1)) + archive_sha1_final(&mtree->sha1ctx, reg->digest.sha1); #endif #ifdef ARCHIVE_HAS_SHA256 - if (mtree->compute_sum & F_SHA256 && !reg->mset_digest.sha256) + if ((mtree->compute_sum & F_SHA256) + && !(reg->mset_digest & AE_MSET_DIGEST_SHA256)) + archive_sha256_final(&mtree->sha256ctx, reg->digest.sha256); #endif #ifdef ARCHIVE_HAS_SHA384 - if (mtree->compute_sum & F_SHA384 && !reg->mset_digest.sha384) + if ((mtree->compute_sum & F_SHA384) + && !(reg->mset_digest & AE_MSET_DIGEST_SHA384)) + archive_sha384_final(&mtree->sha384ctx, reg->digest.sha384); #endif #ifdef ARCHIVE_HAS_SHA512 - if (mtree->compute_sum & F_SHA512 && !reg->mset_digest.sha512) + if ((mtree->compute_sum & F_SHA512) + && !(reg->mset_digest & AE_MSET_DIGEST_SHA512)) + archive_sha512_final(&mtree->sha512ctx, reg->digest.sha512); #endif /* Save what types of sum are computed. */ -- 2.47.2