From 24ca8fae64d6088cb10a424c4bc6a7eb16ddeb26 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 3 Apr 2013 10:36:03 +0200 Subject: [PATCH] qemu-blockjob: Fix limit of bandwidth for block jobs to supported value The JSON generator is able to represent only values less than LLONG_MAX, fix the bandwidth limit checks when converting to value to catch overflows before they reach the generator. --- src/qemu/qemu_monitor.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 30f78203e7..d1c6690c38 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2889,12 +2889,13 @@ qemuMonitorDriveMirror(qemuMonitorPtr mon, "flags=%x", mon, device, file, NULLSTR(format), bandwidth, flags); - /* Convert bandwidth MiB to bytes */ + /* Convert bandwidth MiB to bytes - unfortunately the JSON QMP protocol is + * limited to LLONG_MAX also for unsigned values */ speed = bandwidth; - if (speed > ULLONG_MAX / 1024 / 1024) { + if (speed > LLONG_MAX >> 20) { virReportError(VIR_ERR_OVERFLOW, _("bandwidth must be less than %llu"), - ULLONG_MAX / 1024 / 1024); + LLONG_MAX >> 20); return -1; } speed <<= 20; @@ -2936,12 +2937,13 @@ qemuMonitorBlockCommit(qemuMonitorPtr mon, const char *device, VIR_DEBUG("mon=%p, device=%s, top=%s, base=%s, bandwidth=%ld", mon, device, NULLSTR(top), NULLSTR(base), bandwidth); - /* Convert bandwidth MiB to bytes */ + /* Convert bandwidth MiB to bytes - unfortunately the JSON QMP protocol is + * limited to LLONG_MAX also for unsigned values */ speed = bandwidth; - if (speed > ULLONG_MAX / 1024 / 1024) { + if (speed > LLONG_MAX >> 20) { virReportError(VIR_ERR_OVERFLOW, _("bandwidth must be less than %llu"), - ULLONG_MAX / 1024 / 1024); + LLONG_MAX >> 20); return -1; } speed <<= 20; @@ -3056,12 +3058,13 @@ int qemuMonitorBlockJob(qemuMonitorPtr mon, "modern=%d", mon, device, NULLSTR(base), bandwidth, info, mode, modern); - /* Convert bandwidth MiB to bytes */ + /* Convert bandwidth MiB to bytes - unfortunately the JSON QMP protocol is + * limited to LLONG_MAX also for unsigned values */ speed = bandwidth; - if (speed > ULLONG_MAX / 1024 / 1024) { + if (speed > LLONG_MAX >> 20) { virReportError(VIR_ERR_OVERFLOW, _("bandwidth must be less than %llu"), - ULLONG_MAX / 1024 / 1024); + LLONG_MAX >> 20); return -1; } speed <<= 20; -- 2.47.2