On 5/20/21 11:14 AM, Pavel Hrdina wrote:
>From QEMU docs/interop/qcow2.txt :
Byte 20 - 23: cluster_bits
Number of bits that are used for addressing an offset
within a cluster (1 << cluster_bits is the cluster size).
With this patch libvirt will be able to report the current cluster_size
for all existing storage volumes managed by storage driver.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
Changes in v2:
- Reworkded to use callback.
src/storage/storage_util.c | 3 ++
src/storage_file/storage_file_probe.c | 70 ++++++++++++++++++++-------
2 files changed, 56 insertions(+), 17 deletions(-)
[...]
+static unsigned long long
+qcow2GetClusterSize(const char *buf,
+ size_t buf_size,
+ int endian)
+{
+ int clusterBits = 0;
+
+ if ((QCOWX_HDR_CLUSTER_BITS_OFFSET + 4) > buf_size)
+ return 0;
+
+ if (endian == LV_LITTLE_ENDIAN)
+ clusterBits = virReadBufInt32LE(buf + QCOWX_HDR_CLUSTER_BITS_OFFSET);
+ else
+ clusterBits = virReadBufInt32BE(buf + QCOWX_HDR_CLUSTER_BITS_OFFSET);
+
+ if (clusterBits > 0)
+ return 1 << clusterBits;
+
Coverity showed me a new error today: OVERFLOW_BEFORE_WIDEN
1) Event overflow_before_widen: Potentially overflowing expression "1 <<
clusterBits" with type "int" (32 bits, signed) is evaluated using 32-bit
arithmetic, and then used in a context that expects an expression of
type "unsigned long long" (64 bits, unsigned).
(2) Event remediation: To avoid overflow, cast "1" to type "unsigned
long long".
John
+ return 0;
+}
+
+
[...]