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:
Oleksandr Tymoshenko 2020-07-13 02:24:31 +00:00
parent 551d20f044
commit e331252340

View File

@ -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;