
On 05/07/2014 09:05 PM, John Ferlan wrote:
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4bb4819..3e407d7 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -9421,6 +9421,7 @@ qemuDomainBlockResize(virDomainPtr dom, virDomainObjPtr vm; qemuDomainObjPrivatePtr priv; int ret = -1, idx; + unsigned long long size_up; char *device = NULL; virDomainDiskDefPtr disk = NULL;
@@ -9467,6 +9474,21 @@ qemuDomainBlockResize(virDomainPtr dom, } disk = vm->def->disks[idx];
+ /* qcow2 and qed must be sized appropriately, so be sure our value + * is sized appropriately and will fit + */ + if (size != size_up && + (disk->src.format == VIR_STORAGE_FILE_QCOW2 || + disk->src.format == VIR_STORAGE_FILE_QED)) { + if (size_up > ULLONG_MAX) {
This is always false.
An OVERLy cautious check - I cannot remember what I was thinking about a month ago... I think this was the check can VIR_ROUND_UP provide an incorrect value. I can send a follow-up patch to remove those lines if that's desired.
VIR_ROUND_UP can still overflow if the size was specified in bytes and is larger than ULLONG_MAX-511. This is unlikely to happen in the real world, but it would be nice to check for it.
+ virReportError(VIR_ERR_OVERFLOW, + _("size must be less than %llu KiB"), + ULLONG_MAX / 1024); + goto endjob; + } + size = size_up;
Just a nitpick: rounding it up unconditionally here would get rid of the temporary variable and have no effect on values specified without the BYTES flag.
Only qcow2 and qed have this issue regarding needing to be on a 512 byte boundary. Since this is a generic routine I was limiting the rounding to the two types from the bz rather than taking a chance that some generic round up would cause some other issue. Or am I misinterpreting your comment?
I meant unconditional on whether the size was specified in bytes or not, something like: if (qcow2 or qed) { size = VIR_ROUND_UP(size, 512); } Jan