mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-05 21:15:45 +00:00
qcow: Calculate the max refcounts as a u64
u32's get multiplied together and can overflow. A usize was being returned, make everything a u64 to make sure it fits. Change-Id: I87071d294f4e62247c9ae72244db059a7b528b62 Signed-off-by: Dylan Reid <dgreid@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1651459 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> (cherry picked from crosvm commit 21c941786ea0cb72114f3e9c7c940471664862b5) Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
parent
f927d1a2d7
commit
35a3b47554
@ -322,11 +322,15 @@ impl QcowHeader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn max_refcount_clusters(refcount_order: u32, cluster_size: u32, num_clusters: u32) -> usize {
|
fn max_refcount_clusters(refcount_order: u32, cluster_size: u32, num_clusters: u32) -> u64 {
|
||||||
let refcount_bytes = (0x01u32 << refcount_order) / 8;
|
// Use u64 as the product of the u32 inputs can overflow.
|
||||||
let for_data = div_round_up_u32(num_clusters * refcount_bytes, cluster_size);
|
let refcount_bytes = (0x01 << u64::from(refcount_order)) / 8;
|
||||||
let for_refcounts = div_round_up_u32(for_data * refcount_bytes, cluster_size);
|
let for_data = div_round_up_u64(
|
||||||
for_data as usize + for_refcounts as usize
|
u64::from(num_clusters) * refcount_bytes,
|
||||||
|
u64::from(cluster_size),
|
||||||
|
);
|
||||||
|
let for_refcounts = div_round_up_u64(for_data * refcount_bytes, u64::from(cluster_size));
|
||||||
|
for_data + for_refcounts
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents a qcow2 file. This is a sparse file format maintained by the qemu project.
|
/// Represents a qcow2 file. This is a sparse file format maintained by the qemu project.
|
||||||
@ -446,7 +450,7 @@ impl QcowFile {
|
|||||||
header.refcount_order,
|
header.refcount_order,
|
||||||
cluster_size as u32,
|
cluster_size as u32,
|
||||||
(num_clusters + l1_clusters + num_l2_clusters + header_clusters) as u32,
|
(num_clusters + l1_clusters + num_l2_clusters + header_clusters) as u32,
|
||||||
) as u64;
|
);
|
||||||
let refcount_block_entries = cluster_size / refcount_bytes;
|
let refcount_block_entries = cluster_size / refcount_bytes;
|
||||||
let refcounts = RefCount::new(
|
let refcounts = RefCount::new(
|
||||||
&mut raw_file,
|
&mut raw_file,
|
||||||
|
Loading…
Reference in New Issue
Block a user