]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu-blockjob: Fix limit of bandwidth for block jobs to supported value
authorPeter Krempa <pkrempa@redhat.com>
Wed, 3 Apr 2013 08:36:03 +0000 (10:36 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 3 Apr 2013 14:38:51 +0000 (16:38 +0200)
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

index 30f78203e788da3a683023910c03ab5cd85074b7..d1c6690c382b84c7ff3ac31ee648e5b12a3359e9 100644 (file)
@@ -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;