This fixes a possible double free. In virNetworkAssignDef() if
virBitmapNew() fails, then virNetworkObjFree(network) is called.
However, with network->def pointing to actual @def. So if caller
frees @def again, ...
Moreover, this fixes one possible memory leak too. In
virInterfaceAssignDef() if appending to the list of interfaces
fails, we ought to call virInterfaceObjFree() instead of bare
VIR_FREE().
Although, in order to do that some array size variables needs
to be turned into size_t rather than int.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/conf/domain_conf.c | 120 +++++++++-----------------------------------
src/conf/domain_conf.h | 4 +-
src/conf/interface_conf.c | 26 +++-------
src/conf/interface_conf.h | 2 +-
src/conf/network_conf.c | 30 ++++-------
src/conf/network_conf.h | 4 +-
src/conf/node_device_conf.c | 16 ++----
src/conf/node_device_conf.h | 2 +-
src/conf/nwfilter_conf.c | 33 ++++--------
src/conf/nwfilter_conf.h | 8 +--
src/conf/nwfilter_params.c | 12 ++---
src/conf/nwfilter_params.h | 2 +-
src/conf/object_event.c | 14 +-----
src/conf/storage_conf.c | 16 ++----
src/qemu/qemu_driver.c | 4 +-
15 files changed, 76 insertions(+), 217 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 1d5cc14..e1b0115 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10216,17 +10216,9 @@ void virDomainDiskInsertPreAlloced(virDomainDefPtr def,
}
}
- /* No disks with this bus yet, so put at end of list */
- if (insertAt == -1)
- insertAt = def->ndisks;
-
- if (insertAt < def->ndisks)
- memmove(def->disks + insertAt + 1,
- def->disks + insertAt,
- (sizeof(def->disks[0]) * (def->ndisks-insertAt)));
-
- def->disks[insertAt] = disk;
- def->ndisks++;
+ /* VIR_INSERT_ELEMENT_INPLACE will never return an error here. */
+ ignore_value(VIR_INSERT_ELEMENT_INPLACE(def->disks, insertAt,
+ def->ndisks, disk));
}
@@ -10235,19 +10227,7 @@ virDomainDiskRemove(virDomainDefPtr def, size_t i)
{
virDomainDiskDefPtr disk = def->disks[i];
- if (def->ndisks > 1) {
- memmove(def->disks + i,
- def->disks + i + 1,
- sizeof(*def->disks) *
- (def->ndisks - (i + 1)));
- def->ndisks--;
- if (VIR_REALLOC_N(def->disks, def->ndisks) < 0) {
- /* ignore, harmless */
- }
- } else {
- VIR_FREE(def->disks);
- def->ndisks = 0;
- }
+ VIR_DELETE_ELEMENT(def->disks, i, def->ndisks);
return disk;
}
@@ -10274,13 +10254,17 @@ virDomainHasDiskMirror(virDomainObjPtr vm)
int virDomainNetInsert(virDomainDefPtr def, virDomainNetDefPtr net)
{
- if (VIR_REALLOC_N(def->nets, def->nnets + 1) < 0)
+ /* hostdev net devices must also exist in the hostdevs array */
+ if (net->type == VIR_DOMAIN_NET_TYPE_HOSTDEV &&
+ virDomainHostdevInsert(def, &net->data.hostdev.def) < 0)
+ return -1;
+
+ if (VIR_APPEND_ELEMENT(def->nets, def->nnets, net) < 0) {
+ /* virDomainHostdevInsert just appends new hostdevs, so we are sure
+ * that the hostdev we've added a few lines above is at the end of
+ * array. Although, devices are indexed from zero ... */
+ virDomainHostdevRemove(def, def->nhostdevs - 1);
return -1;
- def->nets[def->nnets] = net;
- def->nnets++;
- if (net->type == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
- /* hostdev net devices must also exist in the hostdevs array */
- return virDomainHostdevInsert(def, &net->data.hostdev.def);
}
return 0;
}
@@ -10360,19 +10344,7 @@ virDomainNetRemove(virDomainDefPtr def, size_t i)
virDomainNetDefPtr net = def->nets[i];
virDomainNetRemoveHostdev(def, net);
-
- if (def->nnets > 1) {
- memmove(def->nets + i,
- def->nets + i + 1,
- sizeof(*def->nets) * (def->nnets - (i + 1)));
- def->nnets--;
- if (VIR_REALLOC_N(def->nets, def->nnets) < 0) {
- /* ignore harmless */
- }
- } else {
- VIR_FREE(def->nets);
- def->nnets = 0;
- }
+ VIR_DELETE_ELEMENT(def->nets, i, def->nnets);
return net;
}
@@ -10415,17 +10387,9 @@ void virDomainControllerInsertPreAlloced(virDomainDefPtr def,
}
}
- /* No controllers with this bus yet, so put at end of list */
- if (insertAt == -1)
- insertAt = def->ncontrollers;
-
- if (insertAt < def->ncontrollers)
- memmove(def->controllers + insertAt + 1,
- def->controllers + insertAt,
- (sizeof(def->controllers[0]) * (def->ncontrollers-insertAt)));
-
- def->controllers[insertAt] = controller;
- def->ncontrollers++;
+ /* VIR_INSERT_ELEMENT_INPLACE will never return an error here. */
+ ignore_value(VIR_INSERT_ELEMENT_INPLACE(def->controllers, insertAt,
+ def->ncontrollers, controller));
}
int
@@ -10449,20 +10413,7 @@ virDomainControllerRemove(virDomainDefPtr def, size_t i)
{
virDomainControllerDefPtr controller = def->controllers[i];
- if (def->ncontrollers > 1) {
- memmove(def->controllers + i,
- def->controllers + i + 1,
- sizeof(*def->controllers) *
- (def->ncontrollers - (i + 1)));
- def->ncontrollers--;
- if (VIR_REALLOC_N(def->controllers, def->ncontrollers) < 0) {
- /* ignore, harmless */
- }
- } else {
- VIR_FREE(def->controllers);
- def->ncontrollers = 0;
- }
-
+ VIR_DELETE_ELEMENT(def->controllers, i, def->ncontrollers);
return controller;
}
@@ -10520,16 +10471,7 @@ virDomainLeaseRemoveAt(virDomainDefPtr def, size_t i)
virDomainLeaseDefPtr lease = def->leases[i];
- if (def->nleases > 1) {
- memmove(def->leases + i,
- def->leases + i + 1,
- sizeof(*def->leases) *
- (def->nleases - (i + 1)));
- VIR_SHRINK_N(def->leases, def->nleases, 1);
- } else {
- VIR_FREE(def->leases);
- def->nleases = 0;
- }
+ VIR_DELETE_ELEMENT(def->leases, i, def->nleases);
return lease;
}
@@ -14451,7 +14393,7 @@ virDomainVcpuPinFindByVcpu(virDomainVcpuPinDefPtr *def,
int
virDomainVcpuPinAdd(virDomainVcpuPinDefPtr **vcpupin_list,
- int *nvcpupin,
+ size_t *nvcpupin,
unsigned char *cpumap,
int maplen,
int vcpu)
@@ -14484,11 +14426,9 @@ virDomainVcpuPinAdd(virDomainVcpuPinDefPtr **vcpupin_list,
if (!vcpupin->cpumask)
goto error;
- if (VIR_REALLOC_N(*vcpupin_list, *nvcpupin + 1) < 0)
+ if (VIR_APPEND_ELEMENT(*vcpupin_list, *nvcpupin, vcpupin) < 0)
goto error;
- (*vcpupin_list)[(*nvcpupin)++] = vcpupin;
-
return 0;
error:
@@ -14500,7 +14440,6 @@ int
virDomainVcpuPinDel(virDomainDefPtr def, int vcpu)
{
int n;
- bool deleted = false;
virDomainVcpuPinDefPtr *vcpupin_list = def->cputune.vcpupin;
/* No vcpupin exists yet */
@@ -14512,24 +14451,11 @@ virDomainVcpuPinDel(virDomainDefPtr def, int vcpu)
if (vcpupin_list[n]->vcpuid == vcpu) {
virBitmapFree(vcpupin_list[n]->cpumask);
VIR_FREE(vcpupin_list[n]);
- memmove(&vcpupin_list[n],
- &vcpupin_list[n+1],
- (def->cputune.nvcpupin - n - 1) * sizeof(virDomainVcpuPinDef *));
- deleted = true;
+ VIR_DELETE_ELEMENT(vcpupin_list, n, def->cputune.nvcpupin);
break;
}
}
- if (!deleted)
- return 0;
-
- if (--def->cputune.nvcpupin == 0) {
- VIR_FREE(def->cputune.vcpupin);
- } else {
- if (VIR_REALLOC_N(def->cputune.vcpupin, def->cputune.nvcpupin) < 0)
- return -1;
- }
-
return 0;
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 2467f65..82d4c61 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2003,7 +2003,7 @@ struct _virDomainDef {
long long quota;
unsigned long long emulator_period;
long long emulator_quota;
- int nvcpupin;
+ size_t nvcpupin;
virDomainVcpuPinDefPtr *vcpupin;
virDomainVcpuPinDefPtr emulatorpin;
} cputune;
@@ -2410,7 +2410,7 @@ int virDomainDefCompatibleDevice(virDomainDefPtr def,
virDomainDeviceDefPtr dev);
int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr **vcpupin_list,
- int *nvcpupin,
+ size_t *nvcpupin,
unsigned char *cpumap,
int maplen,
int vcpu);
diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
index 8053307..09f7d92 100644
--- a/src/conf/interface_conf.c
+++ b/src/conf/interface_conf.c
@@ -1266,16 +1266,14 @@ virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr
interfaces,
return NULL;
}
virInterfaceObjLock(iface);
+
+ if (VIR_APPEND_ELEMENT_COPY(interfaces->objs,
+ interfaces->count, iface) < 0) {
+ virInterfaceObjFree(iface);
+ return NULL;
+ }
+
iface->def = def;
-
- if (VIR_REALLOC_N(interfaces->objs, interfaces->count + 1) < 0) {
- VIR_FREE(iface);
- return NULL;
- }
-
- interfaces->objs[interfaces->count] = iface;
- interfaces->count++;
-
return iface;
}
@@ -1292,15 +1290,7 @@ void virInterfaceRemove(virInterfaceObjListPtr interfaces,
virInterfaceObjUnlock(interfaces->objs[i]);
virInterfaceObjFree(interfaces->objs[i]);
- if (i < (interfaces->count - 1))
- memmove(interfaces->objs + i, interfaces->objs + i + 1,
- sizeof(*(interfaces->objs)) * (interfaces->count - (i +
1)));
-
- if (VIR_REALLOC_N(interfaces->objs, interfaces->count - 1) < 0) {
- ; /* Failure to reduce memory allocation isn't fatal */
- }
- interfaces->count--;
-
+ VIR_DELETE_ELEMENT(interfaces->objs, i, interfaces->count);
break;
}
virInterfaceObjUnlock(interfaces->objs[i]);
diff --git a/src/conf/interface_conf.h b/src/conf/interface_conf.h
index 0e22575..2c759bc 100644
--- a/src/conf/interface_conf.h
+++ b/src/conf/interface_conf.h
@@ -171,7 +171,7 @@ struct _virInterfaceObj {
typedef struct _virInterfaceObjList virInterfaceObjList;
typedef virInterfaceObjList *virInterfaceObjListPtr;
struct _virInterfaceObjList {
- unsigned int count;
+ size_t count;
virInterfaceObjPtr *objs;
};
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index bac0465..5a2bd06 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -372,9 +372,6 @@ virNetworkAssignDef(virNetworkObjListPtr nets,
return network;
}
- if (VIR_REALLOC_N(nets->objs, nets->count + 1) < 0)
- return NULL;
-
if (VIR_ALLOC(network) < 0)
return NULL;
if (virMutexInit(&network->lock) < 0) {
@@ -384,9 +381,9 @@ virNetworkAssignDef(virNetworkObjListPtr nets,
return NULL;
}
virNetworkObjLock(network);
- network->def = def;
- if (!(network->class_id = virBitmapNew(CLASS_ID_BITMAP_SIZE)))
+ if (VIR_APPEND_ELEMENT_COPY(nets->objs, nets->count, network) < 0 ||
+ !(network->class_id = virBitmapNew(CLASS_ID_BITMAP_SIZE)))
goto error;
/* The first three class IDs are already taken */
@@ -395,8 +392,6 @@ virNetworkAssignDef(virNetworkObjListPtr nets,
ignore_value(virBitmapSetBit(network->class_id, 2));
network->def = def;
- nets->objs[nets->count] = network;
- nets->count++;
return network;
error:
@@ -576,15 +571,7 @@ void virNetworkRemoveInactive(virNetworkObjListPtr nets,
virNetworkObjUnlock(nets->objs[i]);
virNetworkObjFree(nets->objs[i]);
- if (i < (nets->count - 1))
- memmove(nets->objs + i, nets->objs + i + 1,
- sizeof(*(nets->objs)) * (nets->count - (i + 1)));
-
- if (VIR_REALLOC_N(nets->objs, nets->count - 1) < 0) {
- ; /* Failure to reduce memory allocation isn't fatal */
- }
- nets->count--;
-
+ VIR_DELETE_ELEMENT(nets->objs, i, nets->count);
break;
}
virNetworkObjUnlock(nets->objs[i]);
@@ -900,14 +887,17 @@ virNetworkDNSHostDefParseXML(const char *networkName,
if (cur->type == XML_ELEMENT_NODE &&
xmlStrEqual(cur->name, BAD_CAST "hostname")) {
if (cur->children != NULL) {
- if (VIR_REALLOC_N(def->names, def->nnames + 1) < 0)
- goto error;
- def->names[def->nnames++] = (char *)xmlNodeGetContent(cur);
- if (!def->names[def->nnames - 1]) {
+ char *name = (char *) xmlNodeGetContent(cur);
+
+ if (!name) {
virReportError(VIR_ERR_XML_DETAIL,
_("Missing hostname in network '%s' DNS
HOST record"),
networkName);
}
+ if (VIR_APPEND_ELEMENT(def->names, def->nnames, name) < 0) {
+ VIR_FREE(name);
+ goto error;
+ }
}
}
cur = cur->next;
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
index 3abe180..1a864de 100644
--- a/src/conf/network_conf.h
+++ b/src/conf/network_conf.h
@@ -108,7 +108,7 @@ typedef struct _virNetworkDNSHostDef virNetworkDNSHostDef;
typedef virNetworkDNSHostDef *virNetworkDNSHostDefPtr;
struct _virNetworkDNSHostDef {
virSocketAddr ip;
- int nnames;
+ size_t nnames;
char **names;
};
@@ -294,7 +294,7 @@ struct _virNetworkObj {
typedef struct _virNetworkObjList virNetworkObjList;
typedef virNetworkObjList *virNetworkObjListPtr;
struct _virNetworkObjList {
- unsigned int count;
+ size_t count;
virNetworkObjPtr *objs;
};
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index ea85cff..d86bbed 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -186,15 +186,13 @@ virNodeDeviceObjPtr virNodeDeviceAssignDef(virNodeDeviceObjListPtr
devs,
return NULL;
}
virNodeDeviceObjLock(device);
- device->def = def;
- if (VIR_REALLOC_N(devs->objs, devs->count+1) < 0) {
- device->def = NULL;
+ if (VIR_APPEND_ELEMENT_COPY(devs->objs, devs->count, device) < 0){
virNodeDeviceObjUnlock(device);
virNodeDeviceObjFree(device);
return NULL;
}
- devs->objs[devs->count++] = device;
+ device->def = def;
return device;
@@ -213,15 +211,7 @@ void virNodeDeviceObjRemove(virNodeDeviceObjListPtr devs,
virNodeDeviceObjUnlock(dev);
virNodeDeviceObjFree(devs->objs[i]);
- if (i < (devs->count - 1))
- memmove(devs->objs + i, devs->objs + i + 1,
- sizeof(*(devs->objs)) * (devs->count - (i + 1)));
-
- if (VIR_REALLOC_N(devs->objs, devs->count - 1) < 0) {
- ; /* Failure to reduce memory allocation isn't fatal */
- }
- devs->count--;
-
+ VIR_DELETE_ELEMENT(devs->objs, i, devs->count);
break;
}
virNodeDeviceObjUnlock(dev);
diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
index 9f3abe7..26116a1 100644
--- a/src/conf/node_device_conf.h
+++ b/src/conf/node_device_conf.h
@@ -204,7 +204,7 @@ struct _virNodeDeviceObj {
typedef struct _virNodeDeviceObjList virNodeDeviceObjList;
typedef virNodeDeviceObjList *virNodeDeviceObjListPtr;
struct _virNodeDeviceObjList {
- unsigned int count;
+ size_t count;
virNodeDeviceObjPtr *objs;
};
diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
index 52e1c06..d25e0cc 100644
--- a/src/conf/nwfilter_conf.c
+++ b/src/conf/nwfilter_conf.c
@@ -399,15 +399,13 @@ virNWFilterRuleDefAddString(virNWFilterRuleDefPtr nwf,
const char *string,
size_t maxstrlen)
{
- if (VIR_REALLOC_N(nwf->strings, nwf->nstrings+1) < 0)
- return NULL;
+ char *tmp;
- if (VIR_STRNDUP(nwf->strings[nwf->nstrings], string, maxstrlen) < 0)
- return NULL;
+ if (VIR_STRNDUP(tmp, string, maxstrlen) < 0 ||
+ VIR_APPEND_ELEMENT_COPY(nwf->strings, nwf->nstrings, tmp) < 0)
+ VIR_FREE(tmp);
- nwf->nstrings++;
-
- return nwf->strings[nwf->nstrings-1];
+ return tmp;
}
@@ -425,15 +423,7 @@ virNWFilterObjRemove(virNWFilterObjListPtr nwfilters,
virNWFilterObjUnlock(nwfilters->objs[i]);
virNWFilterObjFree(nwfilters->objs[i]);
- if (i < (nwfilters->count - 1))
- memmove(nwfilters->objs + i, nwfilters->objs + i + 1,
- sizeof(*(nwfilters->objs)) * (nwfilters->count - (i +
1)));
-
- if (VIR_REALLOC_N(nwfilters->objs, nwfilters->count - 1) < 0) {
- ; /* Failure to reduce memory allocation isn't fatal */
- }
- nwfilters->count--;
-
+ VIR_DELETE_ELEMENT(nwfilters->objs, i, nwfilters->count);
break;
}
virNWFilterObjUnlock(nwfilters->objs[i]);
@@ -2593,11 +2583,11 @@ virNWFilterDefParseXML(xmlXPathContextPtr ctxt) {
}
if (entry->rule || entry->include) {
- if (VIR_REALLOC_N(ret->filterEntries, ret->nentries+1) < 0) {
+ if (VIR_APPEND_ELEMENT_COPY(ret->filterEntries,
+ ret->nentries, entry) < 0) {
virNWFilterEntryFree(entry);
goto cleanup;
}
- ret->filterEntries[ret->nentries++] = entry;
} else
virNWFilterEntryFree(entry);
}
@@ -3029,15 +3019,14 @@ virNWFilterObjAssignDef(virNWFilterObjListPtr nwfilters,
}
virNWFilterObjLock(nwfilter);
nwfilter->active = 0;
- nwfilter->def = def;
- if (VIR_REALLOC_N(nwfilters->objs, nwfilters->count + 1) < 0) {
- nwfilter->def = NULL;
+ if (VIR_APPEND_ELEMENT_COPY(nwfilters->objs,
+ nwfilters->count, nwfilter) < 0) {
virNWFilterObjUnlock(nwfilter);
virNWFilterObjFree(nwfilter);
return NULL;
}
- nwfilters->objs[nwfilters->count++] = nwfilter;
+ nwfilter->def = def;
return nwfilter;
}
diff --git a/src/conf/nwfilter_conf.h b/src/conf/nwfilter_conf.h
index 0d09b6a..8c59330 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;
};
@@ -547,7 +547,7 @@ struct _virNWFilterObj {
typedef struct _virNWFilterObjList virNWFilterObjList;
typedef virNWFilterObjList *virNWFilterObjListPtr;
struct _virNWFilterObjList {
- unsigned int count;
+ size_t count;
virNWFilterObjPtr *objs;
};
@@ -572,7 +572,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 589fcf8..2379aa7 100644
--- a/src/conf/nwfilter_params.c
+++ b/src/conf/nwfilter_params.c
@@ -256,13 +256,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(val->u.array.values, pos, val->u.array.nValues);
return 0;
}
break;
@@ -642,11 +636,11 @@ virNWFilterHashTablePut(virNWFilterHashTablePtr table,
if (VIR_STRDUP(newName, name) < 0)
return -1;
- if (VIR_REALLOC_N(table->names, table->nNames + 1) < 0) {
+ if (VIR_APPEND_ELEMENT_COPY(table->names,
+ table->nNames, newName) < 0) {
VIR_FREE(newName);
return -1;
}
- table->names[table->nNames++] = newName;
}
if (virHashAddEntry(table->hashTable, name, val) < 0) {
diff --git a/src/conf/nwfilter_params.h b/src/conf/nwfilter_params.h
index 6b0b1a1..5e9777b 100644
--- a/src/conf/nwfilter_params.h
+++ b/src/conf/nwfilter_params.h
@@ -67,7 +67,7 @@ typedef virNWFilterHashTable *virNWFilterHashTablePtr;
struct _virNWFilterHashTable {
virHashTablePtr hashTable;
- int nNames;
+ size_t nNames;
char **names;
};
diff --git a/src/conf/object_event.c b/src/conf/object_event.c
index de45257..5ceca8a 100644
--- a/src/conf/object_event.c
+++ b/src/conf/object_event.c
@@ -266,8 +266,7 @@ virObjectEventCallbackListMarkDeleteID(virConnectPtr conn,
static int
virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList)
{
- int old_count = cbList->count;
- int n;
+ size_t n;
for (n = 0; n < cbList->count; n++) {
if (cbList->callbacks[n]->deleted) {
virFreeCallback freecb = cbList->callbacks[n]->freecb;
@@ -276,19 +275,10 @@ virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr
cbList)
virObjectUnref(cbList->callbacks[n]->conn);
VIR_FREE(cbList->callbacks[n]);
- if (n < (cbList->count - 1))
- memmove(cbList->callbacks + n,
- cbList->callbacks + n + 1,
- sizeof(*(cbList->callbacks)) *
- (cbList->count - (n + 1)));
- cbList->count--;
+ VIR_DELETE_ELEMENT(cbList->callbacks, n, cbList->count);
n--;
}
}
- if (cbList->count < old_count &&
- VIR_REALLOC_N(cbList->callbacks, cbList->count) < 0) {
- ; /* Failure to reduce memory allocation isn't fatal */
- }
return 0;
}
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index e4232e9..ac323d0 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -458,15 +458,7 @@ virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
virStoragePoolObjUnlock(pools->objs[i]);
virStoragePoolObjFree(pools->objs[i]);
- if (i < (pools->count - 1))
- memmove(pools->objs + i, pools->objs + i + 1,
- sizeof(*(pools->objs)) * (pools->count - (i + 1)));
-
- if (VIR_REALLOC_N(pools->objs, pools->count - 1) < 0) {
- ; /* Failure to reduce memory allocation isn't fatal */
- }
- pools->count--;
-
+ VIR_DELETE_ELEMENT(pools->objs, i, pools->count);
break;
}
virStoragePoolObjUnlock(pools->objs[i]);
@@ -1782,15 +1774,13 @@ virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools,
}
virStoragePoolObjLock(pool);
pool->active = 0;
- pool->def = def;
- if (VIR_REALLOC_N(pools->objs, pools->count+1) < 0) {
- pool->def = NULL;
+ if (VIR_APPEND_ELEMENT_COPY(pools->objs, pools->count, pool) < 0) {
virStoragePoolObjUnlock(pool);
virStoragePoolObjFree(pool);
return NULL;
}
- pools->objs[pools->count++] = pool;
+ pool->def = def;
return pool;
}
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index f3a1f58..72bb592 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4301,7 +4301,7 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
int ret = -1;
qemuDomainObjPrivatePtr priv;
bool doReset = false;
- int newVcpuPinNum = 0;
+ size_t newVcpuPinNum = 0;
virDomainVcpuPinDefPtr *newVcpuPin = NULL;
virBitmapPtr pcpumap = NULL;
virQEMUDriverConfigPtr cfg = NULL;
@@ -4575,7 +4575,7 @@ qemuDomainPinEmulator(virDomainPtr dom,
int ret = -1;
qemuDomainObjPrivatePtr priv;
bool doReset = false;
- int newVcpuPinNum = 0;
+ size_t newVcpuPinNum = 0;
virDomainVcpuPinDefPtr *newVcpuPin = NULL;
virBitmapPtr pcpumap = NULL;
virQEMUDriverConfigPtr cfg = NULL;
--
1.9.0