svn commit: r363140 - head/usr.bin/mkimg
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Mon Jul 13 02:24:32 UTC 2020
Author: gonzo
Date: Mon Jul 13 02:24:31 2020
New Revision: 363140
URL: https://svnweb.freebsd.org/changeset/base/363140
Log:
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
Modified:
head/usr.bin/mkimg/vhdx.c
Modified: head/usr.bin/mkimg/vhdx.c
==============================================================================
--- head/usr.bin/mkimg/vhdx.c Mon Jul 13 02:09:21 2020 (r363139)
+++ head/usr.bin/mkimg/vhdx.c Mon Jul 13 02:24:31 2020 (r363140)
@@ -429,7 +429,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);
@@ -445,9 +445,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;
More information about the svn-src-all
mailing list