[libvirt] [PATCH 4/6] uml: Plug memory leak on umlStartVMDaemon() error path

Alex Jia ajia at redhat.com
Thu Dec 1 03:11:49 UTC 2011


On 12/01/2011 07:39 AM, Eric Blake wrote:
> On 11/29/2011 10:57 PM, ajia at redhat.com wrote:
>> From: Alex Jia<ajia at redhat.com>
>>
>> Detected by Coverity.  Leak introduced in commit 8866eed.
>>
>> Signed-off-by: Alex Jia<ajia at redhat.com>
>> ---
>>   src/uml/uml_driver.c |    1 +
>>   1 files changed, 1 insertions(+), 0 deletions(-)
>>
>> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
>> index 073f362..fe6d5ba 100644
>> --- a/src/uml/uml_driver.c
>> +++ b/src/uml/uml_driver.c
>> @@ -1051,6 +1051,7 @@ static int umlStartVMDaemon(virConnectPtr conn,
>>           VIR_FREE(vm->def->consoles[i]->info.alias);
>>           if (virAsprintf(&vm->def->consoles[i]->info.alias, "console%zu", i)<  0) {
>>               virReportOOMError();
>> +            VIR_FORCE_CLOSE(logfd);
>>               goto cleanup;
> Good catch, but while reading the function, I found another bug - if we
> failed to add the domain to autodestroy, we still returned success but
> without setting the domain to transient.  I'm pushing this more
> comprehensive fix:
Indeed, the return value hasn't been stored in 'ret' if we failed to add 
domain
to autodestroy. Eric, thanks.
> diff --git i/src/uml/uml_driver.c w/src/uml/uml_driver.c
> index fe6d5ba..faea313 100644
> --- i/src/uml/uml_driver.c
> +++ w/src/uml/uml_driver.c
> @@ -1033,56 +1033,51 @@ static int umlStartVMDaemon(virConnectPtr conn,
>       /* Do this upfront, so any part of the startup process can add
>        * runtime state to vm->def that won't be persisted. This let's us
>        * report implicit runtime defaults in the XML, like vnc listen/socket
>        */
>       VIR_DEBUG("Setting current domain def as transient");
>       if (virDomainObjSetDefTransient(driver->caps, vm, true)<  0) {
>           VIR_FORCE_CLOSE(logfd);
>           return -1;
>       }
>
> -    if (!(cmd = umlBuildCommandLine(conn, driver, vm))) {
> -        VIR_FORCE_CLOSE(logfd);
> -        virDomainConfVMNWFilterTeardown(vm);
> -        umlCleanupTapDevices(vm);
> -        return -1;
> -    }
> +    if (!(cmd = umlBuildCommandLine(conn, driver, vm)))
> +        goto cleanup;
>
>       for (i = 0 ; i<  vm->def->nconsoles ; i++) {
>           VIR_FREE(vm->def->consoles[i]->info.alias);
>           if (virAsprintf(&vm->def->consoles[i]->info.alias,
> "console%zu", i)<  0) {
>               virReportOOMError();
> -            VIR_FORCE_CLOSE(logfd);
>               goto cleanup;
>           }
>       }
>
>       virCommandWriteArgLog(cmd, logfd);
>
>       priv->monitor = -1;
>
>       virCommandClearCaps(cmd);
>       virCommandSetOutputFD(cmd,&logfd);
>       virCommandSetErrorFD(cmd,&logfd);
>       virCommandDaemonize(cmd);
>
>       ret = virCommandRun(cmd, NULL);
> -    VIR_FORCE_CLOSE(logfd);
>       if (ret<  0)
>           goto cleanup;
>
>       if (autoDestroy&&
> -        umlProcessAutoDestroyAdd(driver, vm, conn)<  0)
> +        (ret = umlProcessAutoDestroyAdd(driver, vm, conn))<  0)
>           goto cleanup;
>
>       ret = virDomainObjSetDefTransient(driver->caps, vm, false);
>   cleanup:
> +    VIR_FORCE_CLOSE(logfd);
>       virCommandFree(cmd);
>
>       if (ret<  0) {
>           virDomainConfVMNWFilterTeardown(vm);
>           umlCleanupTapDevices(vm);
>           if (vm->newDef) {
>               virDomainDefFree(vm->def);
>               vm->def = vm->newDef;
>               vm->def->id = -1;
>               vm->newDef = NULL;
>
>




More information about the libvir-list mailing list