[libvirt] [PATCH] build: add compiler attributes to virUUIDParse
Daniel Veillard
veillard at redhat.com
Thu Oct 13 08:55:28 UTC 2011
On Wed, Oct 12, 2011 at 05:27:40PM -0600, Eric Blake wrote:
> Coverity complained that most, but not all, clients of virUUIDParse
> were checking for errors. Silence those coverity warnings by
> explicitly marking the cases where we trust the input, and fixing
> one instance that really should have been checking. In particular,
> this silences about half of the 46 warnings I saw on my most
> recent Coverity analysis run.
>
> * src/util/uuid.h (virUUIDParse): Enforce rules.
> * src/util/uuid.c (virUUIDParse): Drop impossible check; at least
> Coverity will detect if we break rules and pass NULL.
> * src/xenapi/xenapi_driver.c (xenapiDomainCreateXML)
> (xenapiDomainLookupByID, xenapiDomainLookupByName)
> (xenapiDomainDefineXML): Ignore return when we trust data source.
> * src/vbox/vbox_tmpl.c (nsIDtoChar, vboxIIDToUUID_v3_x)
> (vboxCallbackOnMachineStateChange)
> (vboxCallbackOnMachineRegistered, vboxStoragePoolLookupByName):
> Likewise.
> * src/node_device/node_device_hal.c (gather_system_cap): Likewise.
> * src/xenxs/xen_sxpr.c (xenParseSxpr): Check for errors.
> ---
>
> This one's big enough that I'll wait for ACK before pushing.
>
> src/node_device/node_device_hal.c | 3 ++-
> src/util/uuid.c | 5 +----
> src/util/uuid.h | 3 ++-
> src/vbox/vbox_tmpl.c | 12 ++++++------
> src/xenapi/xenapi_driver.c | 11 ++++++-----
> src/xenxs/xen_sxpr.c | 3 ++-
> 6 files changed, 19 insertions(+), 18 deletions(-)
>
> diff --git a/src/node_device/node_device_hal.c b/src/node_device/node_device_hal.c
> index 481be97..a028886 100644
> --- a/src/node_device/node_device_hal.c
> +++ b/src/node_device/node_device_hal.c
> @@ -38,6 +38,7 @@
> #include "pci.h"
> #include "logging.h"
> #include "node_device_driver.h"
> +#include "ignore-value.h"
>
> #define VIR_FROM_THIS VIR_FROM_NODEDEV
>
> @@ -299,7 +300,7 @@ static int gather_system_cap(LibHalContext *ctx, const char *udi,
> (void)get_str_prop(ctx, udi, "system.hardware.serial",
> &d->system.hardware.serial);
> if (get_str_prop(ctx, udi, "system.hardware.uuid", &uuidstr) == 0) {
> - (void)virUUIDParse(uuidstr, d->system.hardware.uuid);
> + ignore_value(virUUIDParse(uuidstr, d->system.hardware.uuid));
> VIR_FREE(uuidstr);
> }
> (void)get_str_prop(ctx, udi, "system.firmware.vendor",
> diff --git a/src/util/uuid.c b/src/util/uuid.c
> index b4317df..0df3ebc 100644
> --- a/src/util/uuid.c
> +++ b/src/util/uuid.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (C) 2007, 2008, 2009, 2010 Red Hat, Inc.
> + * Copyright (C) 2007-2011 Red Hat, Inc.
> *
> * This library is free software; you can redistribute it and/or
> * modify it under the terms of the GNU Lesser General Public
> @@ -129,9 +129,6 @@ virUUIDParse(const char *uuidstr, unsigned char *uuid) {
> const char *cur;
> int i;
>
> - if ((uuidstr == NULL) || (uuid == NULL))
> - return(-1);
> -
ACK, but I'm always a bit distressed at the idea that a perfectly
valid runtime check is being replaced by a static one which is
compiler specific. Can we keep this chunk without Coverity complaining ?
> /*
> * do a liberal scan allowing '-' and ' ' anywhere between character
> * pairs, and surrounding whitespace, as long as there are exactly
> diff --git a/src/util/uuid.h b/src/util/uuid.h
> index b5d7878..7dbfad5 100644
> --- a/src/util/uuid.h
> +++ b/src/util/uuid.h
> @@ -32,7 +32,8 @@ int virUUIDIsValid(unsigned char *uuid);
> int virUUIDGenerate(unsigned char *uuid);
>
> int virUUIDParse(const char *uuidstr,
> - unsigned char *uuid);
> + unsigned char *uuid)
> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
>
> void virUUIDFormat(const unsigned char *uuid,
> char *uuidstr) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 9b674a9..bc19b63 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -300,7 +300,7 @@ static void nsIDtoChar(unsigned char *uuid, const nsID *iid) {
> }
>
> uuidstrdst[VIR_UUID_STRING_BUFLEN-1] = '\0';
> - virUUIDParse(uuidstrdst, uuid);
> + ignore_value(virUUIDParse(uuidstrdst, uuid));
> }
>
> static void nsIDFromChar(nsID *iid, const unsigned char *uuid) {
> @@ -339,7 +339,7 @@ static void nsIDFromChar(nsID *iid, const unsigned char *uuid) {
> }
>
> uuidstrdst[VIR_UUID_STRING_BUFLEN-1] = '\0';
> - virUUIDParse(uuidstrdst, uuidinterim);
> + ignore_value(virUUIDParse(uuidstrdst, uuidinterim));
> memcpy(iid, uuidinterim, VIR_UUID_BUFLEN);
> }
>
> @@ -511,7 +511,7 @@ vboxIIDToUUID_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid,
>
> data->pFuncs->pfnUtf16ToUtf8(iid->value, &utf8);
>
> - virUUIDParse(utf8, uuid);
> + ignore_value(virUUIDParse(utf8, uuid));
>
> data->pFuncs->pfnUtf8Free(utf8);
> }
> @@ -6558,7 +6558,7 @@ vboxCallbackOnMachineStateChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
> unsigned char uuid[VIR_UUID_BUFLEN];
>
> g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8);
> - virUUIDParse(machineIdUtf8, uuid);
> + ignore_value(virUUIDParse(machineIdUtf8, uuid));
>
> dom = vboxDomainLookupByUUID(g_pVBoxGlobalData->conn, uuid);
> if (dom) {
> @@ -6686,7 +6686,7 @@ vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
> unsigned char uuid[VIR_UUID_BUFLEN];
>
> g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8);
> - virUUIDParse(machineIdUtf8, uuid);
> + ignore_value(virUUIDParse(machineIdUtf8, uuid));
>
> dom = vboxDomainLookupByUUID(g_pVBoxGlobalData->conn, uuid);
> if (dom) {
> @@ -7983,7 +7983,7 @@ static virStoragePoolPtr vboxStoragePoolLookupByName(virConnectPtr conn, const c
> unsigned char uuid[VIR_UUID_BUFLEN];
> const char *uuidstr = "1deff1ff-1481-464f-967f-a50fe8936cc4";
>
> - virUUIDParse(uuidstr, uuid);
> + ignore_value(virUUIDParse(uuidstr, uuid));
>
> ret = virGetStoragePool(conn, name, uuid);
> }
> diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
> index 80a706a..3946455 100644
> --- a/src/xenapi/xenapi_driver.c
> +++ b/src/xenapi/xenapi_driver.c
> @@ -40,6 +40,7 @@
> #include "xenapi_driver.h"
> #include "xenapi_driver_private.h"
> #include "xenapi_utils.h"
> +#include "ignore-value.h"
>
> #define VIR_FROM_THIS VIR_FROM_XENAPI
>
> @@ -528,7 +529,7 @@ xenapiDomainCreateXML (virConnectPtr conn,
> virDomainDefFree(defPtr);
> if (record) {
> unsigned char raw_uuid[VIR_UUID_BUFLEN];
> - virUUIDParse(record->uuid, raw_uuid);
> + ignore_value(virUUIDParse(record->uuid, raw_uuid));
> if (vm) {
> if (xen_vm_start(session, vm, false, false)) {
> domP = virGetDomain(conn, record->name_label, raw_uuid);
> @@ -574,13 +575,13 @@ xenapiDomainLookupByID (virConnectPtr conn, int id)
> xen_session_get_this_host(session, &host, session);
> if (host != NULL && session->ok) {
> xen_host_get_resident_vms(session, &result, host);
> - if (result != NULL ) {
> + if (result != NULL) {
> for (i = 0; i < result->size; i++) {
> xen_vm_get_domid(session, &domID, result->contents[i]);
> if (domID == id) {
> xen_vm_get_record(session, &record, result->contents[i]);
> xen_vm_get_uuid(session, &uuid, result->contents[i]);
> - virUUIDParse(uuid, raw_uuid);
> + ignore_value(virUUIDParse(uuid, raw_uuid));
> domP = virGetDomain(conn, record->name_label, raw_uuid);
> if (domP) {
> int64_t domid = -1;
> @@ -672,7 +673,7 @@ xenapiDomainLookupByName (virConnectPtr conn,
> vm = vms->contents[0];
> xen_vm_get_uuid(session, &uuid, vm);
> if (uuid!=NULL) {
> - virUUIDParse(uuid, raw_uuid);
> + ignore_value(virUUIDParse(uuid, raw_uuid));
> domP = virGetDomain(conn, name, raw_uuid);
> if (domP != NULL) {
> int64_t domid = -1;
> @@ -1683,7 +1684,7 @@ xenapiDomainDefineXML (virConnectPtr conn, const char *xml)
> }
> if (record != NULL) {
> unsigned char raw_uuid[VIR_UUID_BUFLEN];
> - virUUIDParse(record->uuid, raw_uuid);
> + ignore_value(virUUIDParse(record->uuid, raw_uuid));
> domP = virGetDomain(conn, record->name_label, raw_uuid);
> if (!domP && !session->ok)
> xenapiSessionErrorHandler(conn, VIR_ERR_NO_DOMAIN, NULL);
> diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c
> index f2447f7..d44b0dc 100644
> --- a/src/xenxs/xen_sxpr.c
> +++ b/src/xenxs/xen_sxpr.c
> @@ -1094,7 +1094,8 @@ xenParseSxpr(const struct sexpr *root,
> "%s", _("domain information incomplete, missing name"));
> goto error;
> }
> - virUUIDParse(tmp, def->uuid);
> + if (virUUIDParse(tmp, def->uuid) < 0)
> + goto error;
>
> if (sexpr_node_copy(root, "domain/description", &def->description) < 0)
> goto no_memory;
But fine, ACK
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list