X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fsecurity.c;h=c447e501da73aa3e4580d37fbd6941a4f9fe680c;hb=16a8ddcea30625100698362ca2e78304cfbfe8dd;hp=a17b889c661022f78b0f0465ea1cfd72a7628be1;hpb=3071e89c11d1be71cf45b694432e5908e0c4ded9;p=wimlib diff --git a/src/security.c b/src/security.c index a17b889c..c447e501 100644 --- a/src/security.c +++ b/src/security.c @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2012, 2013, 2014 Eric Biggers + * Copyright 2012-2023 Eric Biggers * * This file is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free @@ -37,7 +37,7 @@ struct wim_security_data_disk { le32 total_length; le32 num_entries; le64 sizes[]; -} _packed_attribute; +} __attribute__((packed)); struct wim_security_data * new_wim_security_data(void) @@ -84,12 +84,9 @@ read_wim_security_data(const u8 *buf, size_t buf_len, goto out_of_memory; sd_disk = (const struct wim_security_data_disk *)buf; - sd->total_length = le32_to_cpu(sd_disk->total_length); + sd->total_length = ALIGN(le32_to_cpu(sd_disk->total_length), 8); sd->num_entries = le32_to_cpu(sd_disk->num_entries); - DEBUG("Reading security data: num_entries=%u, total_length=%u", - sd->num_entries, sd->total_length); - /* Length field of 0 is a special case that really means length * of 8. */ if (sd->total_length == 0) @@ -123,7 +120,7 @@ read_wim_security_data(const u8 *buf, size_t buf_len, /* Return immediately if no security descriptors. */ if (sd->num_entries == 0) - goto out_align_total_length; + goto out_descriptors_ready; /* Allocate a new buffer for the sizes array */ sd->sizes = MALLOC(sizes_size); @@ -156,13 +153,11 @@ read_wim_security_data(const u8 *buf, size_t buf_len, goto out_of_memory; p += sd->sizes[i]; } -out_align_total_length: - total_len = (total_len + 7) & ~7; - sd->total_length = (sd->total_length + 7) & ~7; - if (total_len != sd->total_length) { - WARNING("Expected WIM security data total length of " - "%u bytes, but calculated %u bytes", - sd->total_length, (unsigned)total_len); +out_descriptors_ready: + if (ALIGN(total_len, 8) != sd->total_length) { + WARNING("Stored WIM security data total length was " + "%"PRIu32" bytes, but calculated %"PRIu32" bytes", + sd->total_length, (u32)total_len); } *sd_ret = sd; ret = 0; @@ -187,9 +182,6 @@ u8 * write_wim_security_data(const struct wim_security_data * restrict sd, u8 * restrict p) { - DEBUG("Writing security data (total_length = %"PRIu32", num_entries " - "= %"PRIu32")", sd->total_length, sd->num_entries); - u8 *orig_p = p; struct wim_security_data_disk *sd_disk = (struct wim_security_data_disk*)p; u32 num_entries = sd->num_entries; @@ -209,8 +201,6 @@ write_wim_security_data(const struct wim_security_data * restrict sd, *p++ = 0; wimlib_assert(p - orig_p == sd->total_length); - - DEBUG("Successfully wrote security data."); return p; } @@ -230,7 +220,7 @@ free_wim_security_data(struct wim_security_data *sd) } struct sd_node { - int32_t security_id; + s32 security_id; u8 hash[SHA1_HASH_SIZE]; struct avl_tree_node index_node; }; @@ -252,10 +242,10 @@ void rollback_new_security_descriptors(struct wim_sd_set *sd_set) { struct wim_security_data *sd = sd_set->sd; - u8 **descriptors = sd->descriptors + sd_set->orig_num_entries; - u32 num_entries = sd->num_entries - sd_set->orig_num_entries; - while (num_entries--) - FREE(*descriptors++); + u32 i; + + for (i = sd_set->orig_num_entries; i < sd->num_entries; i++) + FREE(sd->descriptors[i]); sd->num_entries = sd_set->orig_num_entries; } @@ -284,7 +274,7 @@ insert_sd_node(struct wim_sd_set *set, struct sd_node *new) /* Returns the index of the security descriptor having a SHA1 message digest of * @hash. If not found, return -1. */ -static int32_t +static s32 lookup_sd(struct wim_sd_set *set, const u8 hash[SHA1_HASH_SIZE]) { struct avl_tree_node *res; @@ -305,11 +295,11 @@ lookup_sd(struct wim_sd_set *set, const u8 hash[SHA1_HASH_SIZE]) * the security ID for it. If a new security descriptor cannot be allocated, * return -1. */ -int32_t +s32 sd_set_add_sd(struct wim_sd_set *sd_set, const char *descriptor, size_t size) { u8 hash[SHA1_HASH_SIZE]; - int32_t security_id; + s32 security_id; struct sd_node *new; u8 **descriptors; u64 *sizes; @@ -317,7 +307,7 @@ sd_set_add_sd(struct wim_sd_set *sd_set, const char *descriptor, size_t size) struct wim_security_data *sd; bool bret; - sha1_buffer(descriptor, size, hash); + sha1(descriptor, size, hash); security_id = lookup_sd(sd_set, hash); if (security_id >= 0) /* Identical descriptor already exists */ @@ -354,7 +344,6 @@ sd_set_add_sd(struct wim_sd_set *sd_set, const char *descriptor, size_t size) sd->descriptors[sd->num_entries] = descr_copy; sd->sizes[sd->num_entries] = size; sd->num_entries++; - DEBUG("There are now %u security descriptors", sd->num_entries); bret = insert_sd_node(sd_set, new); wimlib_assert(bret); security_id = new->security_id; @@ -389,7 +378,7 @@ init_sd_set(struct wim_sd_set *sd_set, struct wim_security_data *sd) ret = WIMLIB_ERR_NOMEM; goto out_destroy_sd_set; } - sha1_buffer(sd->descriptors[i], sd->sizes[i], new->hash); + sha1(sd->descriptors[i], sd->sizes[i], new->hash); new->security_id = i; if (!insert_sd_node(sd_set, new)) FREE(new); /* Ignore duplicate security descriptor */