[libvirt] [PATCHv4 14/17] nwfilter: use VIR_(APPEND|DELETE)_ELEMENT for lists

Laine Stump laine at laine.org
Mon Dec 10 21:20:35 UTC 2012


There are a few lists in the nwfilter data structures that lend
themselves to using the new convenience macros.

Note that this patch incidentally fixes what appears to be a bug in
virNWFilterUnRegisterCallbackDriver - it was finding an entry to
delete, adjusting the array to get rid of it, then writing a 0 over
the item that had just been moved into the place previously occupied
by the now-deleted item (I think the intent was to 0 out the end of the
list, which also doesn't make sense, since the memory allocated to the
list had just been decreased in size).
---
 src/conf/nwfilter_conf.c               | 35 ++++++++++++++--------------------
 src/conf/nwfilter_conf.h               |  6 +++---
 src/conf/nwfilter_params.c             |  8 +-------
 src/nwfilter/nwfilter_gentech_driver.c | 15 ++++++---------
 4 files changed, 24 insertions(+), 40 deletions(-)

diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
index 2d32bd3..dbacbda 100644
--- a/src/conf/nwfilter_conf.c
+++ b/src/conf/nwfilter_conf.c
@@ -395,20 +395,19 @@ virNWFilterRuleDefAddString(virNWFilterRuleDefPtr nwf,
                             const char *string,
                             size_t maxstrlen)
 {
-    if (VIR_REALLOC_N(nwf->strings, nwf->nstrings+1) < 0) {
+    char *copy = strndup(string, maxstrlen);
+
+    if (!copy) {
         virReportOOMError();
         return NULL;
     }
 
-    nwf->strings[nwf->nstrings] = strndup(string, maxstrlen);
-
-    if (!nwf->strings[nwf->nstrings]) {
+    if (VIR_APPEND_ELEMENT(nwf->strings, nwf->nstrings, copy) < 0) {
         virReportOOMError();
+        VIR_FREE(copy);
         return NULL;
     }
 
-    nwf->nstrings++;
-
     return nwf->strings[nwf->nstrings-1];
 }
 
@@ -2585,14 +2584,14 @@ virNWFilterDefParseXML(xmlXPathContextPtr ctxt) {
                 entry->include = virNWFilterIncludeParse(curr);
 
             if (entry->rule || entry->include) {
-                if (VIR_REALLOC_N(ret->filterEntries, ret->nentries+1) < 0) {
-                    VIR_FREE(entry);
+                if (VIR_APPEND_ELEMENT(ret->filterEntries, ret->nentries, entry) < 0) {
+                    virNWFilterEntryFree(entry);
                     virReportOOMError();
                     goto cleanup;
                 }
-                ret->filterEntries[ret->nentries++] = entry;
-            } else
+            } else {
                 VIR_FREE(entry);
+            }
         }
         curr = curr->next;
     }
@@ -2811,7 +2810,7 @@ virNWFilterDefLoopDetect(virConnectPtr conn,
     return _virNWFilterDefLoopDetect(conn, nwfilters, def, def->name);
 }
 
-int nCallbackDriver;
+size_t nCallbackDriver;
 #define MAX_CALLBACK_DRIVER 10
 static virNWFilterCallbackDriverPtr callbackDrvArray[MAX_CALLBACK_DRIVER];
 
@@ -2831,12 +2830,8 @@ virNWFilterUnRegisterCallbackDriver(virNWFilterCallbackDriverPtr cbd)
     while (i < nCallbackDriver && callbackDrvArray[i] != cbd)
         i++;
 
-    if (i < nCallbackDriver) {
-        memmove(&callbackDrvArray[i], &callbackDrvArray[i+1],
-                (nCallbackDriver - i - 1) * sizeof(callbackDrvArray[i]));
-        callbackDrvArray[i] = 0;
-        nCallbackDriver--;
-    }
+    if (i < nCallbackDriver)
+        VIR_DELETE_ELEMENT_INPLACE(callbackDrvArray, i, nCallbackDriver);
 }
 
 void
@@ -3047,16 +3042,14 @@ virNWFilterObjAssignDef(virConnectPtr conn,
     nwfilter->active = 0;
     nwfilter->def = def;
 
-    if (VIR_REALLOC_N(nwfilters->objs, nwfilters->count + 1) < 0) {
+    if (VIR_APPEND_ELEMENT(nwfilters->objs, nwfilters->count, nwfilter) < 0) {
         nwfilter->def = NULL;
         virNWFilterObjUnlock(nwfilter);
         virNWFilterObjFree(nwfilter);
         virReportOOMError();
         return NULL;
     }
-    nwfilters->objs[nwfilters->count++] = nwfilter;
-
-    return nwfilter;
+    return nwfilters->objs[nwfilters->count - 1];
 }
 
 
diff --git a/src/conf/nwfilter_conf.h b/src/conf/nwfilter_conf.h
index 4a2a9f3..893b345 100644
--- a/src/conf/nwfilter_conf.h
+++ b/src/conf/nwfilter_conf.h
@@ -476,7 +476,7 @@ struct _virNWFilterRuleDef {
     size_t nVarAccess;
     virNWFilterVarAccessPtr *varAccess;
 
-    int nstrings;
+    size_t nstrings;
     char **strings;
 };
 
@@ -524,7 +524,7 @@ struct _virNWFilterDef {
     char *chainsuffix;
     virNWFilterChainPriority chainPriority;
 
-    int nentries;
+    size_t nentries;
     virNWFilterEntryPtr *filterEntries;
 };
 
@@ -571,7 +571,7 @@ typedef virNWFilterTechDriver *virNWFilterTechDriverPtr;
 typedef struct _virNWFilterRuleInst virNWFilterRuleInst;
 typedef virNWFilterRuleInst *virNWFilterRuleInstPtr;
 struct _virNWFilterRuleInst {
-   int ndata;
+   size_t ndata;
    void **data;
    virNWFilterTechDriverPtr techdriver;
 };
diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c
index 7254519..0bd6ae4 100644
--- a/src/conf/nwfilter_params.c
+++ b/src/conf/nwfilter_params.c
@@ -269,13 +269,7 @@ virNWFilterVarValueDelNthValue(virNWFilterVarValuePtr val, unsigned int pos)
     case NWFILTER_VALUE_TYPE_ARRAY:
         if (pos < val->u.array.nValues) {
             VIR_FREE(val->u.array.values[pos]);
-            val->u.array.nValues--;
-
-            if (pos < val->u.array.nValues)
-                memmove(&val->u.array.values[pos],
-                        &val->u.array.values[pos + 1],
-                        sizeof(val->u.array.values[0]) *
-                            (val->u.array.nValues - pos));
+            VIR_DELETE_ELEMENT_INPLACE(val->u.array.values, pos, val->u.array.nValues);
             return 0;
         }
         break;
diff --git a/src/nwfilter/nwfilter_gentech_driver.c b/src/nwfilter/nwfilter_gentech_driver.c
index 572acf4..d0cf238 100644
--- a/src/nwfilter/nwfilter_gentech_driver.c
+++ b/src/nwfilter/nwfilter_gentech_driver.c
@@ -1,7 +1,7 @@
 /*
  * nwfilter_gentech_driver.c: generic technology driver
  *
- * Copyright (C) 2011 Red Hat, Inc.
+ * Copyright (C) 2011, 2012 Red Hat, Inc.
  * Copyright (C) 2010 IBM Corp.
  * Copyright (C) 2010 Stefan Berger
  *
@@ -109,11 +109,10 @@ int
 virNWFilterRuleInstAddData(virNWFilterRuleInstPtr res,
                            void *data)
 {
-    if (VIR_REALLOC_N(res->data, res->ndata+1) < 0) {
+    if (VIR_APPEND_ELEMENT(res->data, res->ndata, data) < 0) {
         virReportOOMError();
         return -1;
     }
-    res->data[res->ndata++] = data;
     return 0;
 }
 
@@ -387,7 +386,7 @@ _virNWFilterInstantiateRec(virNWFilterTechDriverPtr techdriver,
                            virNWFilterDefPtr filter,
                            const char *ifname,
                            virNWFilterHashTablePtr vars,
-                           int *nEntries,
+                           size_t *nEntries,
                            virNWFilterRuleInstPtr **insts,
                            enum instCase useNewFilter, bool *foundNewFilter,
                            virNWFilterDriverStatePtr driver)
@@ -413,14 +412,12 @@ _virNWFilterInstantiateRec(virNWFilterTechDriverPtr techdriver,
                 break;
             }
 
-            if (VIR_REALLOC_N(*insts, (*nEntries)+1) < 0) {
+            if (VIR_APPEND_ELEMENT(*insts, *nEntries, inst) < 0) {
                 virReportOOMError();
                 rc = -1;
                 break;
             }
 
-            (*insts)[(*nEntries)++] = inst;
-
         } else if (inc) {
             VIR_DEBUG("Instantiating filter %s", inc->filterref);
             obj = virNWFilterObjFindByName(&driver->nwfilters, inc->filterref);
@@ -595,7 +592,7 @@ virNWFilterDetermineMissingVarsRec(virNWFilterDefPtr filter,
 
 
 static int
-virNWFilterRuleInstancesToArray(int nEntries,
+virNWFilterRuleInstancesToArray(size_t nEntries,
                                 virNWFilterRuleInstPtr *insts,
                                 void ***ptrs,
                                 int *nptrs)
@@ -662,7 +659,7 @@ virNWFilterInstantiate(const unsigned char *vmuuid ATTRIBUTE_UNUSED,
 {
     int rc;
     int j, nptrs;
-    int nEntries = 0;
+    size_t nEntries = 0;
     virNWFilterRuleInstPtr *insts = NULL;
     void **ptrs = NULL;
     int instantiate = 1;
-- 
1.7.11.7




More information about the libvir-list mailing list