[libvirt] [PATCH v2] hyperv: recognize array property as distinct type.

Matthias Bolte matthias.bolte at googlemail.com
Tue Apr 18 08:30:34 UTC 2017


2017-04-11 21:42 GMT+02:00 Dawid Zamirski <dzamirski at datto.com>:
> When hyperv code generator for WMI classes identifies common
> properties, it needs to take into account array type as a distinct
> type, i.e string != string[]. This is the case where v1 of the
> Msvm_VirtualSystemSettingData has Notes property as string whereas v2
> uses Notes[], therefore they have to be treated as different fields and
> cannot be placed in the "common" struct.
> ---
>
> changes in v2:
>  * move notes variable assignment outside of the loop so that it's not
>    reset at each iteration.
>
>  src/hyperv/hyperv_driver.c         | 25 +++++++++++++++++++++++--
>  src/hyperv/hyperv_wmi_generator.py |  2 +-
>  2 files changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
> index 090ea24..350f123 100644
> --- a/src/hyperv/hyperv_driver.c
> +++ b/src/hyperv/hyperv_driver.c
> @@ -894,8 +894,29 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
>      if (VIR_STRDUP(def->name, computerSystem->data.common->ElementName) < 0)
>          goto cleanup;
>
> -    if (VIR_STRDUP(def->description, virtualSystemSettingData->data.common->Notes) < 0)
> -        goto cleanup;
> +    if (priv->wmiVersion == HYPERV_WMI_VERSION_V1) {
> +        if (VIR_STRDUP(def->description,
> +                       virtualSystemSettingData->data.v1->Notes) < 0)
> +            goto cleanup;
> +    } else if (priv->wmiVersion == HYPERV_WMI_VERSION_V2 &&
> +               virtualSystemSettingData->data.v2->Notes.data != NULL) {
> +        char **notes = (char **) virtualSystemSettingData->data.v2->Notes.data;
> +        virBuffer buf = VIR_BUFFER_INITIALIZER;
> +        size_t i = 0;
> +
> +        /* in practice Notes has 1 element */
> +        for (i = 0; i < virtualSystemSettingData->data.v2->Notes.count; i++) {
> +            /* but if there's more than 1, separate by double new line */
> +            if (virBufferUse(&buf) > 0)
> +                virBufferAddLit(&buf, "\n\n");
> +
> +            virBufferAdd(&buf, *notes, -1);
> +            notes++;
> +        }


virBufferContentAndReset will silently return NULL if an error (e.g.
OOM) occurred while building the buffer content. You current code will
silently set description to NULL instead of properly reporting an
error. Use virBufferCheckError as shown here:

http://libvirt.org/hacking.html#strbuf

virBufferCheckError will report and error for you if there is one.


if (virBufferCheckError(&buf))
    goto cleanup;


> +
> +        def->description = virBufferContentAndReset(&buf);
> +    }
> +

-- 
Matthias Bolte
http://photron.blogspot.com




More information about the libvir-list mailing list