On 05/03/2013 08:53 AM, Michal Privoznik wrote:
---
src/cpu/cpu_generic.c | 8 ++++----
src/cpu/cpu_map.c | 3 ++-
src/cpu/cpu_powerpc.c | 13 ++++++-------
src/cpu/cpu_x86.c | 10 +++++-----
4 files changed, 17 insertions(+), 17 deletions(-)
@@ -131,7 +131,7 @@ genericBaseline(virCPUDefPtr *cpus,
}
if (VIR_ALLOC(cpu) < 0 ||
- !(cpu->model = strdup(cpus[0]->model)) ||
+ VIR_STRDUP(cpu->model, cpus[0]->model) < 0 ||
VIR_ALLOC_N(features, cpus[0]->nfeatures) < 0)
goto no_memory;
double-oom reporting, will be cleaned up later, so not an issue for this
patch.
@@ -183,8 +183,8 @@ genericBaseline(virCPUDefPtr *cpus,
if (!features[i].name)
continue;
- if (!(cpu->features[j++].name = strdup(features[i].name)))
- goto no_memory;
+ if (VIR_STRDUP(cpu->features[j++].name, features[i].name) < 0)
+ goto error;
Another case of side effects (j++) inside the macro call. I think we
are safe relying on exactly-once expansion of VIR_STRDUP macros, but we
ought to push a followup patch that documents (in both HACKING and
virstring.h) that the exactly-once semantics are guaranteed for this
particular macro as an exception to the more general rule that any
ALL_CAPS name is a macro that might mishandle side effects. (For that
matter, VIR_ALLOC and VIR_INSERT_ELEMENT also have the same property of
exactly-once semantics, and could also use the same documentation
guarantee, but VIR_APPEND_ELEMENT double-evaluates its 'count'
parameter, unless we rework virInsertElementsN() to take 'at==-1' to
mean use '*countptr' as its initial 'at' value.)
+++ b/src/cpu/cpu_map.c
@@ -27,6 +27,7 @@
#include "cpu.h"
#include "cpu_map.h"
#include "configmake.h"
+#include "virstring.h"
#define VIR_FROM_THIS VIR_FROM_CPU
@@ -149,7 +150,7 @@ cpuMapOverride(const char *path)
{
char *map;
- if (!(map = strdup(path)))
+ if (VIR_STRDUP(map, path) < 0)
silent->noisy, but all callers are limited to tests/*, which just fail
the test anyway, so no change needed.
+++ b/src/cpu/cpu_powerpc.c
@@ -333,9 +333,8 @@ ppcDecode(virCPUDefPtr cpu,
goto cleanup;
}
- if (!(cpu->model = strdup(model->name)) ||
- (model->vendor && !(cpu->vendor =
strdup(model->vendor->name)))) {
- virReportOOMError();
+ if (VIR_STRDUP(cpu->model, model->name) < 0 ||
+ (model->vendor && VIR_STRDUP(cpu->vendor,
model->vendor->name) < 0)) {
Another case where not requiring ATTRIBUTE_NONNNULL(2) on VIR_STRDUP
would be handy. I think I've convinced myself we should go that route.
Maybe it would help if I post a patch showing what I'm thinking?
goto cleanup;
}
@@ -449,11 +448,11 @@ ppcBaseline(virCPUDefPtr *cpus,
}
if (VIR_ALLOC(cpu) < 0 ||
- !(cpu->model = strdup(model->name)))
+ VIR_STRDUP(cpu->model, model->name) < 0)
goto no_memory;
double-oom, but will be cleaned up later
+++ b/src/cpu/cpu_x86.c
@@ -449,13 +449,13 @@ x86DataToCPU(const union cpuData *data,
const struct x86_vendor *vendor;
if (VIR_ALLOC(cpu) < 0 ||
- !(cpu->model = strdup(model->name)) ||
+ VIR_STRDUP(cpu->model, model->name) < 0 ||
!(copy = x86DataCopy(data)) ||
!(modelData = x86DataCopy(model->data)))
goto no_memory;
double-oom, but will be cleaned up later
if ((vendor = x86DataToVendor(copy, map)) &&
- !(cpu->vendor = strdup(vendor->name)))
+ VIR_STRDUP(cpu->vendor, vendor->name) < 0)
goto no_memory;
x86DataSubtract(copy, modelData);
@@ -766,9 +766,9 @@ x86ModelCopy(const struct x86_model *model)
{
struct x86_model *copy;
- if (VIR_ALLOC(copy) < 0
- || !(copy->name = strdup(model->name))
- || !(copy->data = x86DataCopy(model->data))) {
+ if (VIR_ALLOC(copy) < 0 ||
+ VIR_STRDUP(copy->name, model->name) < 0 ||
+ !(copy->data = x86DataCopy(model->data))) {
x86ModelFree(copy);
return NULL;
silent->reporting, but function is static, and all callers already did
'goto no_memory', so this is merely another double-oom that will be
cleaned up in your later pass
ACK.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org