72 lines
2.6 KiB
Diff
72 lines
2.6 KiB
Diff
From 3578c005c8a2f479eb223bb89f7b0fba22d13766 Mon Sep 17 00:00:00 2001
|
||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||
Date: Tue, 22 Mar 2022 11:04:56 +0000
|
||
Subject: [PATCH] vddk: Don't use uninitialized values when computing preferred
|
||
block size
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
Commit 63d2dd2eb2 ("vddk: Export block size information for this
|
||
plugin") tried to calculate the preferred block size from the logical
|
||
and physical sector size reported by VDDK. Unfortunately VDDK < 7’s
|
||
VixDiskLib_GetInfo API returns a struct which does not contain
|
||
these fields at all. We knew about this already because the
|
||
debug code does not print them, but the block size code uses
|
||
them regardless of the VDDK version.
|
||
|
||
The practical result of this error was that sometimes (depending on
|
||
existing contents of memory) you would see the error:
|
||
|
||
nbdkit: vddk[1]: error: plugin must set preferred block size to a power of 2
|
||
|
||
Fix this by only using the fields when VDDK >= 7, and in earlier
|
||
versions assuming VDDK’s normal sector size.
|
||
|
||
Reported-by: Xiaodai Wang
|
||
Fixes: commit 63d2dd2eb2c9980a07841fe84ec16844085a59c3
|
||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2066655
|
||
(cherry picked from commit 31bc5322b179545bef827022e1ae3b7859387b1b)
|
||
---
|
||
plugins/vddk/vddk.c | 17 +++++++++++++++--
|
||
1 file changed, 15 insertions(+), 2 deletions(-)
|
||
|
||
diff --git a/plugins/vddk/vddk.c b/plugins/vddk/vddk.c
|
||
index 5d31b073..51ef8f33 100644
|
||
--- a/plugins/vddk/vddk.c
|
||
+++ b/plugins/vddk/vddk.c
|
||
@@ -855,6 +855,7 @@ vddk_block_size (void *handle,
|
||
{
|
||
struct vddk_handle *h = handle;
|
||
VixDiskLibInfo *info;
|
||
+ uint32_t logicalSectorSize, physicalSectorSize;
|
||
struct command info_cmd = { .type = INFO, .ptr = &info };
|
||
|
||
if (send_command_and_wait (h, &info_cmd) == -1)
|
||
@@ -862,8 +863,20 @@ vddk_block_size (void *handle,
|
||
|
||
/* VDDK can only serve whole 512 byte sectors. */
|
||
*minimum = VIXDISKLIB_SECTOR_SIZE;
|
||
- *preferred = MAX (MAX (info->logicalSectorSize, info->physicalSectorSize),
|
||
- 4096);
|
||
+
|
||
+ /* The logicalSectorSize and physicalSectorSize fields are only
|
||
+ * present in VDDK >= 7. In earlier versions they will not be
|
||
+ * initialized and contain random values (beyond the end of the
|
||
+ * returned structure). So compute sector sizes with this in mind.
|
||
+ */
|
||
+ logicalSectorSize = physicalSectorSize = VIXDISKLIB_SECTOR_SIZE;
|
||
+ if (library_version >= 7) {
|
||
+ logicalSectorSize = info->logicalSectorSize;
|
||
+ physicalSectorSize = info->physicalSectorSize;
|
||
+ }
|
||
+
|
||
+ *preferred = MAX (MAX (logicalSectorSize, physicalSectorSize), 4096);
|
||
+
|
||
*maximum = 0xffffffff;
|
||
|
||
VDDK_CALL_START (VixDiskLib_FreeInfo, "info")
|
||
--
|
||
2.31.1
|
||
|