X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fsecurity.c;h=6ed83cd7e952a75cc50f13b091414f34cb444506;hb=0a859cd076a942d7145e203c596892ca66f7e4a2;hp=dc3c4096b2c5bbfbe7228725487a67495833e458;hpb=e44157502fe5719717e453a31943050fe8dc839a;p=wimlib diff --git a/src/security.c b/src/security.c index dc3c4096..6ed83cd7 100644 --- a/src/security.c +++ b/src/security.c @@ -28,7 +28,7 @@ #endif #include "wimlib/assert.h" -#include "wimlib/buffer_io.h" +#include "wimlib/endianness.h" #include "wimlib/error.h" #include "wimlib/security.h" #include "wimlib/sha1.h" @@ -146,7 +146,7 @@ struct wim_security_data_disk { * the validation in libntfs-3g. */ static void -empty_sacl_fixup(SECURITY_DESCRIPTOR_RELATIVE *descr, size_t *size_p) +empty_sacl_fixup(SECURITY_DESCRIPTOR_RELATIVE *descr, u64 *size_p) { /* No-op if no NTFS-3g support, or if NTFS-3g is version 2013 or later * */ @@ -181,9 +181,10 @@ new_wim_security_data(void) * Note: There is no `offset' argument because the security data is located at * the beginning of the metadata resource. * - * Possible errors include: + * Return values: + * WIMLIB_ERR_SUCCESS (0) + * WIMLIB_ERR_INVALID_METADATA_RESOURCE * WIMLIB_ERR_NOMEM - * WIMLIB_ERR_INVALID_SECURITY_DATA */ int read_wim_security_data(const u8 metadata_resource[], size_t metadata_resource_len, @@ -271,10 +272,9 @@ read_wim_security_data(const u8 metadata_resource[], size_t metadata_resource_le total_len += sd->sizes[i]; if (total_len > (u64)sd->total_length) goto out_invalid_sd; - sd->descriptors[i] = MALLOC(sd->sizes[i]); + sd->descriptors[i] = memdup(p, sd->sizes[i]); if (!sd->descriptors[i]) goto out_of_memory; - memcpy(sd->descriptors[i], p, sd->sizes[i]); p += sd->sizes[i]; empty_sacl_fixup((SECURITY_DESCRIPTOR_RELATIVE*)sd->descriptors[i], &sd->sizes[i]); @@ -287,13 +287,12 @@ out_align_total_length: "%u bytes, but calculated %u bytes", sd->total_length, (unsigned)total_len); } -out_return_sd: *sd_ret = sd; ret = 0; goto out; out_invalid_sd: ERROR("WIM security data is invalid!"); - ret = WIMLIB_ERR_INVALID_SECURITY_DATA; + ret = WIMLIB_ERR_INVALID_METADATA_RESOURCE; goto out_free_sd; out_of_memory: ERROR("Out of memory while reading WIM security data!"); @@ -316,23 +315,23 @@ write_wim_security_data(const struct wim_security_data * restrict sd, u8 *orig_p = p; struct wim_security_data_disk *sd_disk = (struct wim_security_data_disk*)p; + u32 num_entries = sd->num_entries; sd_disk->total_length = cpu_to_le32(sd->total_length); - sd_disk->num_entries = cpu_to_le32(sd->num_entries); + sd_disk->num_entries = cpu_to_le32(num_entries); - for (u32 i = 0; i < sd->num_entries; i++) + for (u32 i = 0; i < num_entries; i++) sd_disk->sizes[i] = cpu_to_le64(sd->sizes[i]); - p = (u8*)&sd_disk->sizes[sd_disk->num_entries]; + p = (u8*)&sd_disk->sizes[num_entries]; - for (u32 i = 0; i < sd->num_entries; i++) + for (u32 i = 0; i < num_entries; i++) p = mempcpy(p, sd->descriptors[i], sd->sizes[i]); - while (p - orig_p < sd->total_length) + while ((uintptr_t)p & 7) *p++ = 0; wimlib_assert(p - orig_p == sd->total_length); - wimlib_assert(((uintptr_t)p & 7) == 0); DEBUG("Successfully wrote security data."); return p; @@ -554,7 +553,7 @@ sd_set_add_sd(struct wim_sd_set *sd_set, const char *descriptor, size_t size) struct sd_node *new; u8 **descriptors; u64 *sizes; - char *descr_copy; + u8 *descr_copy; struct wim_security_data *sd; bool bret; @@ -570,13 +569,12 @@ sd_set_add_sd(struct wim_sd_set *sd_set, const char *descriptor, size_t size) new = MALLOC(sizeof(*new)); if (!new) goto out; - descr_copy = MALLOC(size); + + descr_copy = memdup(descriptor, size); if (!descr_copy) goto out_free_node; sd = sd_set->sd; - - memcpy(descr_copy, descriptor, size); new->security_id = sd->num_entries; copy_hash(new->hash, hash);