[libvirt] [PATCH 2/3] node device: Break out get_wwns and get_parent_node helpers

Matthias Bolte matthias.bolte at googlemail.com
Sat Oct 17 12:58:57 UTC 2009


2009/10/16 Cole Robinson <crobinso at redhat.com>:
> These will be used by the test driver, so move them to a shareable space.
>
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
>  src/conf/node_device_conf.c          |   89 +++++++++++++++++++++++++++
>  src/conf/node_device_conf.h          |   11 +++
>  src/libvirt_private.syms             |    2 +
>  src/node_device/node_device_driver.c |  112 ++++------------------------------
>  4 files changed, 115 insertions(+), 99 deletions(-)
>
> diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
> index f09f814..77f7be3 100644
> --- a/src/conf/node_device_conf.c
> +++ b/src/conf/node_device_conf.c
> @@ -1215,6 +1215,95 @@ virNodeDeviceDefParseFile(virConnectPtr conn,
>     return virNodeDeviceDefParse(conn, NULL, filename, create);
>  }
>
> +/*
> + * Return fc_host dev's WWNN and WWPN
> + */
> +int
> +virNodeDeviceGetWWNs(virConnectPtr conn,
> +                     virNodeDeviceDefPtr def,
> +                     char **wwnn,
> +                     char **wwpn)
> +{
> +    virNodeDevCapsDefPtr cap = NULL;
> +    int ret = 0;
> +
> +    cap = def->caps;
> +    while (cap != NULL) {
> +        if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST &&
> +            cap->data.scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
> +            *wwnn = strdup(cap->data.scsi_host.wwnn);
> +            *wwpn = strdup(cap->data.scsi_host.wwpn);
> +            break;
> +        }
> +
> +        cap = cap->next;
> +    }
> +
> +    if (cap == NULL) {
> +        virNodeDeviceReportError(conn, VIR_ERR_NO_SUPPORT,
> +                                 "%s", _("Device is not a fibre channel HBA"));
> +        ret = -1;
> +    }
> +
> +    if (*wwnn == NULL || *wwpn == NULL) {

I know you have just moved this function to another file, but here
seems to be a logical error that may result in a false-positive OOM
error.

If the while loop is left without finding the wanted device (cap ==
NULL), then *wwnn and *wwpn have not been set inside this function and
point to their initial value (probably NULL). Because they have not
been set inside this function (in the cap == NULL case), they should
not be tested for NULL to detect an OOM condition.

To fix this

    if (*wwnn == NULL || *wwpn == NULL) {

could be changed to

    else if (*wwnn == NULL || *wwpn == NULL) {

so the OOM check is only done if the wanted device has been found (cap != NULL).

> +        /* Free the other one, if allocated... */
> +        VIR_FREE(wwnn);
> +        VIR_FREE(wwpn);
> +        ret = -1;
> +        virReportOOMError(conn);
> +    }
> +
> +    return ret;
> +}
> +

The OOM detection should be fixed by an additional patch, so ACK to this one.

Matthias




More information about the libvir-list mailing list