* "chunk table" provides the offset, in bytes relative to the end of the
* chunk table, of the start of each compressed chunk, except for the first
* chunk which is omitted as it always has an offset of 0. Chunk table
- * entries are 32-bit for resources <= 4 GiB uncompressed and 64-bit for
- * resources > 4 GiB uncompressed.
+ * entries are 32-bit for resources < 4 GiB uncompressed and 64-bit for
+ * resources >= 4 GiB uncompressed.
*
* - Solid resource format (distinguished by the use of WIM_RESHDR_FLAG_SOLID
* instead of WIM_RESHDR_FLAG_COMPRESSED): similar to the original format, but
}
}
- const u32 chunk_order = fls32(chunk_size);
+ const u32 chunk_order = bsr32(chunk_size);
/* Calculate the total number of chunks the resource is divided into. */
const u64 num_chunks = (rdesc->uncompressed_size + chunk_size - 1) >> chunk_order;
* to initialize the chunk_offsets array. */
u64 first_chunk_entry_to_read;
- u64 last_chunk_entry_to_read;
+ u64 num_chunk_entries_to_read;
if (alt_chunk_table) {
/* The alternate chunk table contains chunk sizes, not
* offsets, so we always must read all preceding entries
* in order to determine offsets. */
first_chunk_entry_to_read = 0;
- last_chunk_entry_to_read = last_needed_chunk;
+ num_chunk_entries_to_read = last_needed_chunk + 1;
} else {
- /* Here we must account for the fact that the first
- * chunk has no explicit chunk table entry. */
- if (read_start_chunk == 0)
+ num_chunk_entries_to_read = last_needed_chunk - read_start_chunk + 1;
+
+ /* The first chunk has no explicit chunk table entry. */
+ if (read_start_chunk == 0) {
+ num_chunk_entries_to_read--;
first_chunk_entry_to_read = 0;
- else
+ } else {
first_chunk_entry_to_read = read_start_chunk - 1;
+ }
- if (last_needed_chunk == 0)
- last_chunk_entry_to_read = 0;
- else
- last_chunk_entry_to_read = last_needed_chunk - 1;
-
+ /* Unless we're reading the final chunk of the resource,
+ * we need the offset of the chunk following the last
+ * needed chunk so that the compressed size of the last
+ * needed chunk can be computed. */
if (last_needed_chunk < num_chunks - 1)
- last_chunk_entry_to_read++;
+ num_chunk_entries_to_read++;
}
- const u64 num_chunk_entries_to_read =
- last_chunk_entry_to_read - first_chunk_entry_to_read + 1;
-
const u64 chunk_offsets_alloc_size =
max(num_chunk_entries_to_read,
num_needed_chunk_offsets) * sizeof(chunk_offsets[0]);
[BLOB_IN_NTFS_VOLUME] = read_ntfs_attribute_prefix,
#endif
#ifdef __WIN32__
- [BLOB_IN_WINNT_FILE_ON_DISK] = read_winnt_stream_prefix,
- [BLOB_WIN32_ENCRYPTED] = read_win32_encrypted_file_prefix,
+ [BLOB_IN_WINDOWS_FILE] = read_windows_file_prefix,
#endif
};
wimlib_assert(blob->blob_location < ARRAY_LEN(handlers)
" Path: \"%"TS"\"\n"
" Expected SHA-1: %"TS"\n"
" Actual SHA-1: %"TS"\n",
- blob->file_on_disk, expected_hashstr, actual_hashstr);
+ blob_file_path(blob), expected_hashstr, actual_hashstr);
return WIMLIB_ERR_CONCURRENT_MODIFICATION_DETECTED;
} else if (blob->blob_location == BLOB_IN_WIM) {
const struct wim_resource_descriptor *rdesc = blob->rdesc;