]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: eliminate memory leaks when converting NetDefs to type='ethernet'
authorLaine Stump <laine@laine.org>
Tue, 21 Jun 2016 18:29:17 +0000 (14:29 -0400)
committerLaine Stump <laine@laine.org>
Sun, 26 Jun 2016 23:33:08 +0000 (19:33 -0400)
in qemuConnectDomainXMLToNative. This function was only accounting for
about 1/10 of all the allocated items in the NetDef prior to memseting
it to all 0's. On top of that, it was going to great pains to learn
the name of the bridge device, but then never doing anything useful
with it (just putting it into data.ethernet.dev, which is *never* used
when building a qemu commandline). (I think this again all started off
as code with good intentions, but it was never completed, and instead
was just Frankensteinically cargo-culted into the odd mish mash we
have today).

The resulting code is much simpler, produces exactly the same output,
and doesn't leak memory.

src/qemu/qemu_driver.c

index a9c791aa92cd04dd41884eaca30278a83372c1c1..61d184bfe46914aa03f7d65b30eb793229ebd378 100644 (file)
@@ -6927,62 +6927,18 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn,
         unsigned int bootIndex = net->info.bootIndex;
         char *model = net->model;
         virMacAddr mac = net->mac;
+        char *script = net->script;
 
-        if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
-            int actualType = virDomainNetGetActualType(net);
-            const char *brname;
-
-            VIR_FREE(net->data.network.name);
-            VIR_FREE(net->data.network.portgroup);
-            if ((actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) &&
-                (brname = virDomainNetGetActualBridgeName(net))) {
-
-                char *brnamecopy;
-
-                if (VIR_STRDUP(brnamecopy, brname) < 0)
-                    goto cleanup;
-
-                virDomainActualNetDefFree(net->data.network.actual);
-
-                memset(net, 0, sizeof(*net));
-
-                net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
-                net->script = NULL;
-                net->data.ethernet.dev = brnamecopy;
-            } else {
-                /* actualType is either NETWORK or DIRECT. In either
-                 * case, the best we can do is NULL everything out.
-                 */
-                virDomainActualNetDefFree(net->data.network.actual);
-                memset(net, 0, sizeof(*net));
-
-                net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
-                net->script = NULL;
-                net->data.ethernet.dev = NULL;
-            }
-        } else if (net->type == VIR_DOMAIN_NET_TYPE_DIRECT) {
-            VIR_FREE(net->data.direct.linkdev);
+        net->model = NULL;
+        net->script = NULL;
 
-            memset(net, 0, sizeof(*net));
-
-            net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
-            net->script = NULL;
-            net->data.ethernet.dev = NULL;
-        } else if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
-            char *script = net->script;
-            char *brname = net->data.bridge.brname;
-
-            memset(net, 0, sizeof(*net));
-
-            net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
-            net->script = script;
-            net->data.ethernet.dev = brname;
-        }
+        virDomainNetDefClear(net);
 
-        VIR_FREE(net->virtPortProfile);
+        net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
         net->info.bootIndex = bootIndex;
         net->model = model;
         net->mac = mac;
+        net->script = script;
     }
 
     if (!(cmd = qemuProcessCreatePretendCmd(conn, driver, vm, NULL,