From a71fd239bd1dad7ac7d656331c386e3fe1ad535c Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Tue, 21 Jun 2016 14:29:17 -0400 Subject: [PATCH] qemu: eliminate memory leaks when converting NetDefs to type='ethernet' 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 | 56 +++++------------------------------------- 1 file changed, 6 insertions(+), 50 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a9c791aa92..61d184bfe4 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -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; + net->model = NULL; + net->script = NULL; - VIR_FREE(net->data.network.name); - VIR_FREE(net->data.network.portgroup); - if ((actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) && - (brname = virDomainNetGetActualBridgeName(net))) { + virDomainNetDefClear(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); - - 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; - } - - 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,