[libvirt] [PATCH] Strict check when listing domains

Eduardo Otubo otubo at linux.vnet.ibm.com
Tue Jun 1 17:55:10 UTC 2010


> 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.


Thanks for the comments, all fixed :-)

diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
index 8a9c7a6..423c95d 100644
--- a/src/phyp/phyp_driver.c
+++ b/src/phyp/phyp_driver.c
@@ -1857,41 +1857,33 @@ 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;

-    /* exit early if there are no domains */
-    if (nids == 0)
-        return 0;
-
-    if (VIR_ALLOC_N(ids, nids) < 0) {
+    if (VIR_ALLOC_N(ids, nids_numdomains) < 0) {
          virReportOOMError();
          goto err;
      }

-    if ((nids = phypListDomainsGeneric(conn, ids, nids, 1)) < 0)
+    if ((nids_listdomains =
+         phypListDomainsGeneric(conn, ids, nids_numdomains, 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 */
-    if (nids == 0) {
-        VIR_FREE(ids);
-        return 0;
-    }
+    if (nids_numdomains != nids_listdomains){
+        VIR_ERROR(_("Unable to determine number of domains."));
+        goto err;
+    }else if (nids_numdomains == 0 && nids_listdomains == 0)
+        goto exit;

      phyp_driver = conn->privateData;
      uuid_table = phyp_driver->uuid_table;
-    uuid_table->nlpars = nids;
+    uuid_table->nlpars = nids_listdomains;

      /* try to get the table from server */
      if (phypUUIDTable_Pull(conn) == -1) {


-- 
Eduardo Otubo
Software Engineer
Linux Technology Center
IBM Systems & Technology Group
Mobile: +55 19 8135 0885
eotubo at linux.vnet.ibm.com




More information about the libvir-list mailing list