X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fintegrity.c;h=7494c3245057ff9ef0f6a582b6add37ef62ce6f6;hb=f98600c0d29ccd437be60a46070976728b38744c;hp=0054c40219a381f954a36bd08c31becb3d924394;hpb=21da2526eff64cdb8e3cb509d34af182d764c701;p=wimlib diff --git a/src/integrity.c b/src/integrity.c index 0054c402..7494c324 100644 --- a/src/integrity.c +++ b/src/integrity.c @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 2012, 2013 Eric Biggers + * Copyright (C) 2012-2016 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 @@ -113,17 +113,18 @@ read_integrity_table(WIMStruct *wim, u64 num_checked_bytes, struct integrity_table *table; int ret; - if (wim->hdr.integrity_table_reshdr.uncompressed_size < 8) - goto invalid; + STATIC_ASSERT(sizeof(struct integrity_table) == 12); + if (wim->hdr.integrity_table_reshdr.uncompressed_size < 12) + return WIMLIB_ERR_INVALID_INTEGRITY_TABLE; ret = wim_reshdr_to_data(&wim->hdr.integrity_table_reshdr, wim, &buf); if (ret) return ret; table = buf; - table->size = le32_to_cpu(table->size); - table->num_entries = le32_to_cpu(table->num_entries); - table->chunk_size = le32_to_cpu(table->chunk_size); + table->size = le32_to_cpu((_force_attr le32)table->size); + table->num_entries = le32_to_cpu((_force_attr le32)table->num_entries); + table->chunk_size = le32_to_cpu((_force_attr le32)table->chunk_size); if (table->size != wim->hdr.integrity_table_reshdr.uncompressed_size || table->size != (u64)table->num_entries * SHA1_HASH_SIZE + 12 || @@ -131,14 +132,11 @@ read_integrity_table(WIMStruct *wim, u64 num_checked_bytes, table->num_entries != DIV_ROUND_UP(num_checked_bytes, table->chunk_size)) { FREE(table); - goto invalid; + return WIMLIB_ERR_INVALID_INTEGRITY_TABLE; } *table_ret = table; return 0; - -invalid: - return WIMLIB_ERR_INVALID_INTEGRITY_TABLE; } /* @@ -315,9 +313,9 @@ write_integrity_table(WIMStruct *wim, new_table_size = new_table->size; - new_table->size = cpu_to_le32(new_table->size); - new_table->num_entries = cpu_to_le32(new_table->num_entries); - new_table->chunk_size = cpu_to_le32(new_table->chunk_size); + new_table->size = (_force_attr u32)cpu_to_le32(new_table->size); + new_table->num_entries = (_force_attr u32)cpu_to_le32(new_table->num_entries); + new_table->chunk_size = (_force_attr u32)cpu_to_le32(new_table->chunk_size); ret = write_wim_resource_from_buffer(new_table, new_table_size,