[libvirt] [PATCH 11/28] qemu: eliminate memory leaks when converting NetDefs to type='ethernet'
Laine Stump
laine at laine.org
Fri Jun 24 19:27:24 UTC 2016
On 06/23/2016 05:59 PM, John Ferlan wrote:
>
> On 06/22/2016 01:37 PM, Laine Stump wrote:
>> 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 517d0b8..4a8cb7a 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -6987,62 +6987,18 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn,
>> unsigned int bootIndex = net->info.bootIndex;
>> char *model = net->model;
>> virMacAddr mac = net->mac;
>> + char *script = net->script;
> Based on 3 spots below where net->script was set to NULL, should this
> only be set when "(net->type == VIR_DOMAIN_NET_TYPE_BRIDGE)" ?
Actually I think that since it's in the common part of the object (and
not in the bridge-specific part) that it should just *always* be saved
and re-set. I'll do that before I push.
>
>
>>
>> - 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;
> ^^^
>
> ACK - whichever way you go with that 'script' setting. I figure you know
> the best answer to my question
>
>
> John
>> - 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,
>>
More information about the libvir-list
mailing list