Fix invalid VHDX generation for image larger than 4Gb
- Part of BAT payload location was lost due to invalid BAT entry encoding type (32 bits instead of 64 bits) - The sequence of PB/SB entries in BAT was broken due to off-by-one index check. It worked for smaller than 4Gb because there were no SB entries in BAT. MFC after: 1 day
This commit is contained in:
parent
551d20f044
commit
e331252340
@ -429,7 +429,7 @@ vhdx_write_bat(int fd, uint64_t image_size)
|
|||||||
payload_offset = 3 + (bat_size / SIZE_1MB);
|
payload_offset = 3 + (bat_size / SIZE_1MB);
|
||||||
bat_ptr = 0;
|
bat_ptr = 0;
|
||||||
for (idx = 0; idx < data_block_count; idx++) {
|
for (idx = 0; idx < data_block_count; idx++) {
|
||||||
le32enc(bat + bat_ptr,
|
le64enc(bat + bat_ptr,
|
||||||
BAT_ENTRY(payload_offset, PAYLOAD_BLOCK_FULLY_PRESENT));
|
BAT_ENTRY(payload_offset, PAYLOAD_BLOCK_FULLY_PRESENT));
|
||||||
bat_ptr += 8;
|
bat_ptr += 8;
|
||||||
payload_offset += (PAYLOAD_BLOCK_SIZE / SIZE_1MB);
|
payload_offset += (PAYLOAD_BLOCK_SIZE / SIZE_1MB);
|
||||||
@ -445,9 +445,9 @@ vhdx_write_bat(int fd, uint64_t image_size)
|
|||||||
bat_ptr = 0;
|
bat_ptr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((idx % chunk_ratio) == 0 &&
|
if (((idx + 1) % chunk_ratio) == 0 &&
|
||||||
(idx > 0) && (idx != data_block_count - 1)) {
|
(idx != data_block_count - 1)) {
|
||||||
le32enc(bat + bat_ptr,
|
le64enc(bat + bat_ptr,
|
||||||
BAT_ENTRY(0, SB_BLOCK_NOT_PRESENT));
|
BAT_ENTRY(0, SB_BLOCK_NOT_PRESENT));
|
||||||
bat_ptr += 8;
|
bat_ptr += 8;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user