X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fintegrity.c;h=7494c3245057ff9ef0f6a582b6add37ef62ce6f6;hb=fc77cae5bad7d23165ed96121134fcc11b1b7d0a;hp=2806708975ee41aad67137281ec96a19045268b0;hpb=a4204528d3fbd8b959025b897493cf68d5cbfc0f;p=wimlib diff --git a/src/integrity.c b/src/integrity.c index 28067089..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 @@ -42,7 +42,7 @@ * information. */ #define INTEGRITY_CHUNK_SIZE 10485760 -/* Only use a different chunk size for compatiblity with an existing integrity +/* Only use a different chunk size for compatibility with an existing integrity * table if the chunk size is between these two numbers. */ #define INTEGRITY_MIN_CHUNK_SIZE 4096 #define INTEGRITY_MAX_CHUNK_SIZE 134217728 @@ -113,23 +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; - - DEBUG("Reading integrity table."); + 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); - - DEBUG("table->size = %u, table->num_entries = %u, " - "table->chunk_size = %u", - table->size, table->num_entries, 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 || @@ -137,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; } /* @@ -311,10 +303,6 @@ write_integrity_table(WIMStruct *wim, int ret; u32 new_table_size; - DEBUG("Writing integrity table " - "(new_blob_table_end=%"PRIu64", old_blob_table_end=%"PRIu64")", - new_blob_table_end, old_blob_table_end); - wimlib_assert(old_blob_table_end <= new_blob_table_end); ret = calculate_integrity_table(&wim->out_fd, new_blob_table_end, @@ -325,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, @@ -339,7 +327,6 @@ write_integrity_table(WIMStruct *wim, NULL, 0); FREE(new_table); - DEBUG("ret=%d", ret); return ret; } @@ -442,10 +429,8 @@ check_wim_integrity(WIMStruct *wim) struct integrity_table *table; u64 end_blob_table_offset; - if (!wim_has_integrity_table(wim)) { - DEBUG("No integrity information."); + if (!wim_has_integrity_table(wim)) return WIM_INTEGRITY_NONEXISTENT; - } end_blob_table_offset = wim->hdr.blob_table_reshdr.offset_in_wim + wim->hdr.blob_table_reshdr.size_in_wim;