[libvirt] [PATCH 02/14] esx: Address resource leak found by Coverity
Matthias Bolte
matthias.bolte at googlemail.com
Thu Jan 10 15:49:07 UTC 2013
2013/1/10 Eric Blake <eblake at redhat.com>:
> On 01/09/2013 07:54 AM, John Ferlan wrote:
>> Because result was used to determine whether or not to free 'priv'
>> resources Coverity tagged the code as having a resource leak. This
>> change addresses that concern.
>> ---
>> src/esx/esx_driver.c | 8 ++++----
>> 1 file changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
>> index 1366c81..9befa38 100644
>> --- a/src/esx/esx_driver.c
>> +++ b/src/esx/esx_driver.c
>> @@ -998,6 +998,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth,
>> virReportOOMError();
>> goto cleanup;
>> }
>> + conn->privateData = priv;
>>
>> if (esxUtil_ParseUri(&priv->parsedUri, conn->uri) < 0) {
>> goto cleanup;
>
> I
>
>> @@ -1008,8 +1009,6 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth,
>> priv->supportsLongMode = esxVI_Boolean_Undefined;
>> priv->usedCpuTimeCounterId = -1;
>>
>> - conn->privateData = priv;
>> -
>> /*
>> * Set the port dependent on the transport protocol if no port is
>> * specified. This allows us to rely on the port parameter being
>> @@ -1104,9 +1103,10 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth,
>> result = VIR_DRV_OPEN_SUCCESS;
>>
>> cleanup:
>> - if (result == VIR_DRV_OPEN_ERROR) {
>> + if (result == VIR_DRV_OPEN_ERROR)
>> + conn->privateData = NULL;
>> + if (priv && !conn->privateData)
>> esxFreePrivate(&priv);
>> - }
>
> This feels a bit complex;
I agree.
> I had to go read esxFreePrivate() to make sure
> it would behave if called on a partial object. Would it be any easier
> to delay the assignment to conn->privateData, and use transfer of
> ownership semantics, so that the cleanup is unconditional?
>
> conn->privateData = priv;
> priv = NULL;
> result = VIR_DRV_OPEN_SUCCESS;
> cleanup:
> esxFreePrivate(&priv);
No! This cannot be done that easily, see commit
b126715a48cd0cbe32ec6468c267cd8cf2961c55 "esx: Fix segfault in
esxConnectToHost".
We cannot move conn->privateData = priv; further down with the current
code, because it is already used in between. But I like the simplicity
of your suggestion.
I'll me come up with a patch for this later today.
--
Matthias Bolte
http://photron.blogspot.com
More information about the libvir-list
mailing list