[libvirt] [PATCH] Strict check when listing domains
Matthias Bolte
matthias.bolte at googlemail.com
Wed May 26 14:35:49 UTC 2010
2010/3/30 Eduardo Otubo <otubo at linux.vnet.ibm.com>:
>
> I am really sorry. I sent an older version of the patch, here is the correct
> one.
>
>
> Eric Blake wrote:
>>
>> On 03/24/2010 11:19 AM, Eduardo Otubo wrote:
>>
>>> /* exit early if there are no domains */
>>> - if (nids == 0)
>>> + if (nids_numdomains == 0 || nids_listdomains == 0
>>> + || nids_numdomains != nids_listdomains)
>>> return 0;
>>
>> Should we be reporting an error here...
>>
>>> - if (VIR_ALLOC_N(ids, nids) < 0) {
>>> + if (VIR_ALLOC_N(ids, nids_listdomains) < 0) {
>>> virReportOOMError();
>>> goto err;
>>> }
>>> - if ((nids = phypListDomainsGeneric(conn, ids, nids, 1)) < 0)
>>> - goto err;
>>> -
>>> - /* exit early if there are no domains */
>>> - /* FIXME: phypNumDomainsGeneric() returned > 0 but
>>> phypListDomainsGeneric()
>>> - * returned 0. indicates this an error condition?
>>> - * an even stricter check would be to treat
>>> - *
>>> - * phypNumDomainsGeneric() != phypListDomainsGeneric()
>>> - *
>>> - * as an error */
>>
>> ...given this comment? You treated it as an early exit of 0, even if
>> both values were non-zero.
>>
>
Sorry for the late review...
> diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
> index 4f7efdb..eb6be32 100644
> --- a/src/phyp/phyp_driver.c
> +++ b/src/phyp/phyp_driver.c
> @@ -1849,41 +1849,32 @@ phypUUIDTable_Init(virConnectPtr conn)
> {
> uuid_tablePtr uuid_table;
> phyp_driverPtr phyp_driver;
> - int nids = 0;
> + int nids_numdomains = 0;
> + int nids_listdomains = 0;
> int *ids = NULL;
> unsigned int i = 0;
>
> - if ((nids = phypNumDomainsGeneric(conn, 2)) < 0)
> + if ((nids_numdomains = phypNumDomainsGeneric(conn, 2)) < 0)
> + goto err;
> +
> + if ((nids_listdomains =
> + phypListDomainsGeneric(conn, ids, nids_listdomains, 1)) < 0)
I think you want to call
phypListDomainsGeneric(conn, ids, nids_numdomains, 1)
instead of
phypListDomainsGeneric(conn, ids, nids_listdomains, 1)
Also, you have to move the allocation of ids before the call to
phypListDomainsGeneric. Otherwise you're calling
phypListDomainsGeneric with ids = NULL resulting in a segfault.
Because you currently pass nids_listdomains (which is always 0 at this
point) to phypListDomainsGeneric you don't trigger the segfault.
> goto err;
>
> /* exit early if there are no domains */
> - if (nids == 0)
> + if (nids_numdomains != nids_listdomains)
You should report an error here, otherwise an "unknown error" will be
reported by libvirt.
> + goto err;
> + else if (nids_numdomains == 0 && nids_listdomains == 0)
> return 0;
Matthias
More information about the libvir-list
mailing list