[libvirt] [PATCH 6/9] Add functions for adding usb controllers to addrs

John Ferlan jferlan at redhat.com
Wed Aug 12 22:10:51 UTC 2015



On 08/12/2015 10:52 AM, Ján Tomko wrote:
> ---
>  src/conf/domain_addr.c   | 88 ++++++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/domain_addr.h   |  4 +++
>  src/libvirt_private.syms |  1 +
>  3 files changed, 93 insertions(+)
> 

Ran the series through Coverity as a first pass...  Figured I'd report
what was spewed first before digging in deeper...

> diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
> index 3962357..024d47b 100644
> --- a/src/conf/domain_addr.c
> +++ b/src/conf/domain_addr.c
> @@ -1239,3 +1239,91 @@ void virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs)
>      VIR_FREE(addrs->buses);
>      VIR_FREE(addrs);
>  }
> +
> +
> +static int virDomainUSBAddressSetAddController(virDomainUSBAddressSetPtr addrs,
> +                                               virDomainControllerDefPtr cont)
> +{
> +    virDomainUSBAddressHubPtr hub = NULL;
> +    size_t ports = 0;
> +    int ret = -1;
> +    int model = cont->model;
> +
> +    VIR_DEBUG("addrs=%p controller type=%d model=%d",
> +              addrs, cont->type, cont->model);
> +
> +    if (VIR_ALLOC(hub) < 0)
> +        goto cleanup;
> +
> +    if (model == -1)
> +        model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
> +
> +    switch ((virDomainControllerModelUSB)model) {
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI:
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI:
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI:
> +        ports = 2;
> +        break;
> +
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI:
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1:
> +        ports = 6;
> +        break;
> +
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1:
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2:
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3:
> +        return 0;
> +        /* FIXME * check the companions? */
> +        ports = 2;
> +        break;

I'm sure you realize Coverity would choke here...  between 'hub' not
being freed and ports=2 not reachable.

> +
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI:
> +        ports = 3;
> +        break;
> +
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI:
> +        ports = 15;
> +
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE:
> +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST:
> +        ret = 0;
> +        goto cleanup;
> +    }
> +
> +    if (cont->idx >= addrs->nbuses) {
> +        if (VIR_EXPAND_N(addrs->buses, addrs->nbuses, cont->idx - addrs->nbuses + 1) < 0)
> +            goto cleanup;
> +    }
> +
> +    if (VIR_ALLOC_N(hub->ports, ports + 1) < 0)
> +        goto cleanup;
> +    hub->nports = ports + 1;
> +
> +    VIR_DEBUG("Added %zu ports on hub %p", hub->nports - 1, hub);
> +
> +    /* FIXME: is there a bus already? */
> +    addrs->buses[cont->idx] = hub;
> +    hub = NULL;
> +
> +    ret = 0;
> + cleanup:
> +    VIR_FREE(hub);
> +    return ret;
> +}
> +
> +
> +int virDomainUSBAddressSetAddControllers(virDomainUSBAddressSetPtr addrs,
> +                                         virDomainDefPtr def)
> +{
> +    size_t i;
> +
> +    for (i = 0; i < def->ncontrollers; i++) {
> +        virDomainControllerDefPtr cont = def->controllers[i];
> +        if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) {
> +            if (virDomainUSBAddressSetAddController(addrs, cont) < 0)
> +                return -1;
> +        }
> +    }
> +    return 0;
> +}
> diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
> index dcf86d4..64d35e9 100644
> --- a/src/conf/domain_addr.h
> +++ b/src/conf/domain_addr.h
> @@ -263,6 +263,10 @@ typedef struct _virDomainUSBAddressSet virDomainUSBAddressSet;
>  typedef virDomainUSBAddressSet *virDomainUSBAddressSetPtr;
>  
>  virDomainUSBAddressSetPtr virDomainUSBAddressSetCreate(void);
> +
> +int virDomainUSBAddressSetAddControllers(virDomainUSBAddressSetPtr addrs,
> +                                         virDomainDefPtr def)
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
>  void virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs);
>  
>  #endif /* __DOMAIN_ADDR_H__ */
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index a628d00..7db4839 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -108,6 +108,7 @@ virDomainPCIAddressSlotInUse;
>  virDomainPCIAddressValidate;
>  virDomainUSBAddressGetPortBuf;
>  virDomainUSBAddressGetPortString;
> +virDomainUSBAddressSetAddControllers;
>  virDomainUSBAddressSetCreate;
>  virDomainUSBAddressSetFree;
>  virDomainVirtioSerialAddrAssign;
> 




More information about the libvir-list mailing list