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-head mailing list