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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list