X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwrite.c;h=fde7e939ed57a83d4ef053ff0d69db755d96750d;hp=abbe4c01fc4668bdaff71f1d1f3a647ea441a3cb;hb=7bbd03a7f450e59ebd7481cd1af0639131630f42;hpb=e8c3ca2d1d0cac3d64985b45a9f654d2029a7518 diff --git a/src/write.c b/src/write.c index abbe4c01..fde7e939 100644 --- a/src/write.c +++ b/src/write.c @@ -87,7 +87,10 @@ struct chunk_table { u64 table_disk_size; u64 cur_offset; u64 *cur_offset_p; - u64 offsets[0]; + union { + u64 offsets[0]; + u32 u32_offsets[0]; + }; }; /* @@ -101,7 +104,7 @@ begin_wim_resource_chunk_tab(const struct wim_lookup_table_entry *lte, struct chunk_table **chunk_tab_ret) { u64 size = wim_resource_size(lte); - u64 num_chunks = (size + WIM_CHUNK_SIZE - 1) / WIM_CHUNK_SIZE; + u64 num_chunks = wim_resource_chunks(lte); size_t alloc_size = sizeof(struct chunk_table) + num_chunks * sizeof(u64); struct chunk_table *chunk_tab = CALLOC(1, alloc_size); @@ -115,7 +118,7 @@ begin_wim_resource_chunk_tab(const struct wim_lookup_table_entry *lte, chunk_tab->file_offset = file_offset; chunk_tab->num_chunks = num_chunks; chunk_tab->original_resource_size = size; - chunk_tab->bytes_per_chunk_entry = (size >= (1ULL << 32)) ? 8 : 4; + chunk_tab->bytes_per_chunk_entry = (size > (1ULL << 32)) ? 8 : 4; chunk_tab->table_disk_size = chunk_tab->bytes_per_chunk_entry * (num_chunks - 1); chunk_tab->cur_offset = 0; @@ -233,8 +236,7 @@ finish_wim_resource_chunk_tab(struct chunk_table *chunk_tab, array_cpu_to_le64(chunk_tab->offsets, chunk_tab->num_chunks); } else { for (u64 i = 0; i < chunk_tab->num_chunks; i++) - ((u32*)chunk_tab->offsets)[i] = - cpu_to_le32(chunk_tab->offsets[i]); + chunk_tab->u32_offsets[i] = cpu_to_le32(chunk_tab->offsets[i]); } bytes_written = full_pwrite(out_fd, (u8*)chunk_tab->offsets + chunk_tab->bytes_per_chunk_entry,