On 05/20/2013 11:55 AM, Michal Privoznik wrote:
---
src/qemu/qemu_capabilities.c | 79 +++-----
src/qemu/qemu_cgroup.c | 4 +-
src/qemu/qemu_command.c | 428 +++++++++++++++++--------------------------
src/qemu/qemu_conf.c | 64 +++----
src/qemu/qemu_domain.c | 26 +--
src/qemu/qemu_driver.c | 129 ++++---------
src/qemu/qemu_hotplug.c | 15 +-
src/qemu/qemu_migration.c | 17 +-
src/qemu/qemu_monitor_json.c | 63 ++-----
src/qemu/qemu_monitor_text.c | 15 +-
src/qemu/qemu_process.c | 64 +++----
11 files changed, 333 insertions(+), 571 deletions(-)
@@ -1912,12 +1899,11 @@ int
virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
if (VIR_ALLOC(mach) < 0)
goto no_memory;
if (qemuCaps->machineAliases[i]) {
- if (!(mach->name = strdup(qemuCaps->machineAliases[i])))
- goto no_memory;
- if (!(mach->canonical = strdup(qemuCaps->machineTypes[i])))
+ if (VIR_STRDUP(mach->name, qemuCaps->machineAliases[i]) < 0 ||
+ VIR_STRDUP(mach->canonical, qemuCaps->machineTypes[i]) < 0)
goto no_memory;
silent->noisy - probably a good change, but may be worth
s/no_memory/error/ in the label so I don't assume it's a double-oom.
+++ b/src/qemu/qemu_command.c
@@ -8549,17 +8524,16 @@ static int qemuStringToArgvEnv(const char *args,
next = strchr(curr, '\n');
if (next) {
- arg = strndup(curr, next-curr);
+ if (VIR_STRNDUP(arg, curr, next - curr) < 0)
+ goto error;
if (*next == '\'' ||
*next == '"')
next++;
} else {
- arg = strdup(curr);
+ if (VIR_STRDUP(arg, curr) < 0)
+ goto error;
}
Perhaps worth shortening to:
if (VIR_STRNDUP(arg, curr, next ? next - curr : strlen(curr)) < 0)
goto error;
but I'll leave that as your call.
@@ -9416,40 +9372,32 @@
qemuParseCommandLineChr(virDomainChrSourceDefPtr source,
host2 = svc1 ? strchr(svc1, '@') : NULL;
svc2 = host2 ? strchr(host2, ':') : NULL;
- if (svc1 && (svc1 != val)) {
- source->data.udp.connectHost = strndup(val, svc1-val);
-
- if (!source->data.udp.connectHost)
- goto no_memory;
- }
+ if (svc1 && svc1 != val &&
+ VIR_STRNDUP(source->data.udp.connectHost, val, svc1 - val) < 0)
+ goto error;
if (svc1) {
svc1++;
- if (host2)
- source->data.udp.connectService = strndup(svc1, host2-svc1);
- else
- source->data.udp.connectService = strdup(svc1);
- if (!source->data.udp.connectService)
- goto no_memory;
+ if ((host2 && VIR_STRNDUP(source->data.udp.connectService,
+ svc1, host2 - svc1) < 0) ||
+ (!host2 && VIR_STRDUP(source->data.udp.connectService,
+ svc1) < 0))
+ goto error;
Looks simpler as:
if (VIR_STRNDUP(source->dta.udp.connectService, sv1,
host2 ? host2 - svc1 : strlen(svc1)) < 0)
goto error;
Hmm, this makes me wonder if it is worth making VIR_STRNDUP slightly
smarter, where if the length argument is -1, then it uses strlen
internally, so we could get away with clients written as:
if (VIR_STRNDUP(source->dta.udp.connectService, sv1,
host2 ? host2 - svc1 : -1) < 0)
After all, we've done magic like that for virBufferAdd (pass -1 instead
of strlen, and virBuffer does the right thing on your behalf). But if
we DO decide to add the magic, it should be in a standalone patch and
with a testsuite addition.
@@ -9472,37 +9420,25 @@
qemuParseCommandLineChr(virDomainChrSourceDefPtr source,
if (opt && strstr(opt, "server"))
source->data.tcp.listen = true;
- source->data.tcp.host = strndup(val, svc-val);
- if (!source->data.tcp.host)
- goto no_memory;
+ if (VIR_STRNDUP(source->data.tcp.host, val, svc - val) < 0)
+ goto error;
svc++;
- if (opt) {
- source->data.tcp.service = strndup(svc, opt-svc);
- } else {
- source->data.tcp.service = strdup(svc);
- }
- if (!source->data.tcp.service)
- goto no_memory;
+ if ((opt && VIR_STRNDUP(source->data.tcp.service, svc, opt - svc)
< 0) ||
+ (!opt && VIR_STRDUP(source->data.tcp.service, svc) < 0))
Again, looks nicer as:
if (VIR_STRNDUP(source->data.tcp.service, svc,
opt ? opt - svc : strlen(svc)) < 0)
[okay, so maybe the magic -1 really is nicer than making clients write
strlen]
+ goto error;
} else if (STRPREFIX(val, "unix:")) {
const char *opt;
val += strlen("unix:");
opt = strchr(val, ',');
source->type = VIR_DOMAIN_CHR_TYPE_UNIX;
- if (opt) {
- if (strstr(opt, "listen"))
- source->data.nix.listen = true;
- source->data.nix.path = strndup(val, opt-val);
- } else {
- source->data.nix.path = strdup(val);
- }
- if (!source->data.nix.path)
- goto no_memory;
+ if ((opt && VIR_STRNDUP(source->data.nix.path, val, opt - val) <
0) ||
+ (!opt && VIR_STRDUP(source->data.nix.path, val) < 0))
and another site
@@ -9555,13 +9491,9 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
next++;
if (p == val) {
- if (next)
- model = strndup(p, next - p - 1);
- else
- model = strdup(p);
-
- if (!model)
- goto no_memory;
+ if ((next && VIR_STRNDUP(model, p, next - p - 1) < 0) ||
+ (!next && VIR_STRDUP(model, p) < 0))
and another site
@@ -9584,13 +9516,9 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
if (*p == '\0' || *p == ',')
goto syntax;
- if (next)
- feature = strndup(p, next - p - 1);
- else
- feature = strdup(p);
-
- if (!feature)
- goto no_memory;
+ if ((next && VIR_STRNDUP(feature, p, next - p - 1) < 0) ||
+ (!next && VIR_STRDUP(feature, p) < 0))
and another
@@ -9648,13 +9576,9 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
if (*p == '\0' || *p == ',')
goto syntax;
- if (next)
- feature = strndup(p, next - p - 1);
- else
- feature = strdup(p);
-
- if (!feature)
- goto no_memory;
+ if ((next && VIR_STRNDUP(feature, p, next - p - 1) < 0) ||
+ (!next && VIR_STRDUP(feature, p) < 0))
+ goto error;
and another.
@@ -10843,7 +10751,7 @@ static int qemuParseProcFileStrings(int
pid_value,
str[nstr-1] = NULL;
ret = nstr-1;
- *list = str;
+ *list = (const char **) str;
Bummer that C's type system makes us add casts, but this one is correct
- nothing you can do about it.
+++ b/src/qemu/qemu_conf.c
@@ -1237,8 +1233,8 @@ qemuAddSharedDevice(virQEMUDriverPtr driver,
if (!(new_entry = qemuSharedDeviceEntryCopy(entry)))
goto cleanup;
- if ((VIR_EXPAND_N(new_entry->domains, new_entry->ref, 1) < 0) ||
- !(new_entry->domains[new_entry->ref - 1] = strdup(name))) {
+ if (VIR_EXPAND_N(new_entry->domains, new_entry->ref, 1) < 0 ||
+ VIR_STRDUP(new_entry->domains[new_entry->ref - 1], name) < 0) {
qemuSharedDeviceEntryFree(new_entry, NULL);
virReportOOMError();
double-oom, but that's okay since a later pass over VIR_EXPAND_N will
also touch this code.
@@ -1249,9 +1245,9 @@ qemuAddSharedDevice(virQEMUDriverPtr driver,
goto cleanup;
}
} else {
- if ((VIR_ALLOC(entry) < 0) ||
- (VIR_ALLOC_N(entry->domains, 1) < 0) ||
- !(entry->domains[0] = strdup(name))) {
+ if (VIR_ALLOC(entry) < 0 ||
+ VIR_ALLOC_N(entry->domains, 1) < 0 ||
+ VIR_STRDUP(entry->domains[0], name) < 0) {
qemuSharedDeviceEntryFree(entry, NULL);
virReportOOMError();
another double-oom, also okay.
+++ b/src/qemu/qemu_driver.c
@@ -11250,9 +11223,8 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr
driver,
}
if (virAsprintf(&device, "drive-%s", disk->info.alias) < 0 ||
- !(source = strdup(snap->file)) ||
- (persistDisk &&
- !(persistSource = strdup(source)))) {
+ VIR_STRDUP(source, snap->file) < 0 ||
+ (persistDisk && VIR_STRDUP(persistSource, source) < 0)) {
virReportOOMError();
double-oom, but okay because of a later cleanup pass on virAsprintf
+++ b/src/qemu/qemu_process.c
@@ -2666,12 +2660,12 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, virDomainObjPtr
vm)
if (state == VIR_DOMAIN_PAUSED && running) {
newState = VIR_DOMAIN_RUNNING;
newReason = VIR_DOMAIN_RUNNING_UNPAUSED;
- msg = strdup("was unpaused");
+ ignore_value(VIR_STRDUP(msg, "was unpaused"));
Since we only use msg in a VIR_DEBUG, this should use VIR_STRDUP_QUIET
and update the message to use NULLSTR(msg) (ie. no need to report an OOM
back to the user just because we failed to print a debug message).
} else if (state == VIR_DOMAIN_RUNNING && !running) {
if (reason == VIR_DOMAIN_PAUSED_SHUTTING_DOWN) {
newState = VIR_DOMAIN_SHUTDOWN;
newReason = VIR_DOMAIN_SHUTDOWN_UNKNOWN;
- msg = strdup("shutdown");
+ ignore_value(VIR_STRDUP(msg, "shutdown"));
same story here.
} else {
newState = VIR_DOMAIN_PAUSED;
newReason = reason;
@@ -2681,7 +2675,7 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, virDomainObjPtr
vm)
} else if (state == VIR_DOMAIN_SHUTOFF && running) {
newState = VIR_DOMAIN_RUNNING;
newReason = VIR_DOMAIN_RUNNING_BOOTED;
- msg = strdup("finished booting");
+ ignore_value(VIR_STRDUP(msg, "finished booting"));
and here. The debug message in question, a few lines later, is:
VIR_DEBUG("Domain %s %s while its monitor was disconnected;"
" changing state to %s (%s)",
vm->def->name,
msg,
virDomainStateTypeToString(newState),
virDomainStateReasonToString(newState, newReason));
I pointed out a few ideas for improvement, but didn't spot any serious
flaws. ACK with those tweaks.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org