MFC r363140:

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.
This commit is contained in:
Oleksandr Tymoshenko 2020-07-14 18:31:15 +00:00
parent 010cdf86c8
commit 2e904e652a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/stable/11/; revision=363190

View File

@ -430,7 +430,7 @@ vhdx_write_bat(int fd, uint64_t image_size)
payload_offset = 3 + (bat_size / SIZE_1MB);
bat_ptr = 0;
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_ptr += 8;
payload_offset += (PAYLOAD_BLOCK_SIZE / SIZE_1MB);
@ -446,9 +446,9 @@ vhdx_write_bat(int fd, uint64_t image_size)
bat_ptr = 0;
}
if ((idx % chunk_ratio) == 0 &&
(idx > 0) && (idx != data_block_count - 1)) {
le32enc(bat + bat_ptr,
if (((idx + 1) % chunk_ratio) == 0 &&
(idx != data_block_count - 1)) {
le64enc(bat + bat_ptr,
BAT_ENTRY(0, SB_BLOCK_NOT_PRESENT));
bat_ptr += 8;