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;
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;
- 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--;
- 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. */
const u64 chunk_offsets_alloc_size =
max(num_chunk_entries_to_read,
num_needed_chunk_offsets) * sizeof(chunk_offsets[0]);
const u64 chunk_offsets_alloc_size =
max(num_chunk_entries_to_read,
num_needed_chunk_offsets) * sizeof(chunk_offsets[0]);