]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Fix bandwidth memory leak on failure
authorAlex Jia <ajia@redhat.com>
Sat, 31 Dec 2011 09:59:16 +0000 (17:59 +0800)
committerEric Blake <eblake@redhat.com>
Sat, 31 Dec 2011 23:42:23 +0000 (16:42 -0700)
Detected by Coverity. Leaks introduced in commit e8d6b29.

Signed-off-by: Alex Jia <ajia@redhat.com>
src/qemu/qemu_driver.c

index d89303ea19e32c1806c5de1c06a4b2c0c02b9c2a..e93fe87ac17d11a3677afc8a48c120440df2a7b3 100644 (file)
@@ -7864,7 +7864,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
     virDomainDefPtr persistentDef = NULL;
     int ret = -1;
     virDomainNetDefPtr net = NULL, persistentNet = NULL;
-    virNetDevBandwidthPtr bandwidth = NULL;
+    virNetDevBandwidthPtr bandwidth = NULL, newBandwidth = NULL;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -7986,27 +7986,25 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
     }
 
     if (flags & VIR_DOMAIN_AFFECT_LIVE) {
-        virNetDevBandwidthPtr newBandwidth;
-
         if (VIR_ALLOC(newBandwidth) < 0) {
             virReportOOMError();
             goto cleanup;
         }
 
-        memset(newBandwidth, 0, sizeof(newBandwidth));
-
         /* virNetDevBandwidthSet() will clear any previous value of
          * bandwidth parameters, so merge with old bandwidth parameters
-         * here to prevent them from losing. */
+         * here to prevent them from being lost. */
         if (bandwidth->in || net->bandwidth->in) {
             if (VIR_ALLOC(newBandwidth->in) < 0) {
                 virReportOOMError();
                 goto cleanup;
             }
             if (bandwidth->in)
-                memcpy(newBandwidth->in, bandwidth->in, sizeof(*newBandwidth->in));
+                memcpy(newBandwidth->in, bandwidth->in,
+                       sizeof(*newBandwidth->in));
             else if (net->bandwidth->in)
-                memcpy(newBandwidth->in, net->bandwidth->in, sizeof(*newBandwidth->in));
+                memcpy(newBandwidth->in, net->bandwidth->in,
+                       sizeof(*newBandwidth->in));
         }
         if (bandwidth->out || net->bandwidth->out) {
             if (VIR_ALLOC(newBandwidth->out) < 0) {
@@ -8014,9 +8012,11 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
                 goto cleanup;
             }
             if (bandwidth->out)
-                memcpy(newBandwidth->out, bandwidth->out, sizeof(*newBandwidth->out));
+                memcpy(newBandwidth->out, bandwidth->out,
+                       sizeof(*newBandwidth->out));
             else if (net->bandwidth->out)
-                memcpy(newBandwidth->out, net->bandwidth->out, sizeof(*newBandwidth->out));
+                memcpy(newBandwidth->out, net->bandwidth->out,
+                       sizeof(*newBandwidth->out));
         }
 
         if (virNetDevBandwidthSet(net->ifname, newBandwidth) < 0) {
@@ -8053,6 +8053,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
     ret = 0;
 cleanup:
     virNetDevBandwidthFree(bandwidth);
+    virNetDevBandwidthFree(newBandwidth);
     virCgroupFree(&group);
     if (vm)
         virDomainObjUnlock(vm);