[libvirt] [PATCH v4 05/13] Adapt to VIR_STRDUP and VIR_STRNDUP in src/qemu/*
Eric Blake
eblake at redhat.com
Wed May 22 22:01:12 UTC 2013
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130522/2cb992d5/attachment-0001.sig>
More information about the libvir-list
mailing list