[libvirt] [PATCH v6 02/23] conf: introduce virNetworkPortDefPtr struct and XML support

John Ferlan jferlan at redhat.com
Tue Jun 18 16:21:50 UTC 2019


[...]

> +static virNetworkPortDefPtr
> +virNetworkPortDefParseXML(xmlXPathContextPtr ctxt)
> +{
> +    virNetworkPortDefPtr def;
> +    char *uuid = NULL;
> +    xmlNodePtr virtPortNode;
> +    xmlNodePtr vlanNode;
> +    xmlNodePtr bandwidthNode;
> +    xmlNodePtr addressNode;
> +    char *trustGuestRxFilters = NULL;
> +    char *mac = NULL;
> +    char *macmgr = NULL;
> +    char *mode = NULL;
> +    char *plugtype = NULL;
> +    char *managed = NULL;
> +    char *driver = NULL;
> +    char *class_id = NULL;
> +
> +    if (VIR_ALLOC(def) < 0)
> +        return NULL;
> +
> +    uuid = virXPathString("string(./uuid)", ctxt);
> +    if (!uuid) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "%s", _("network port has no uuid"));
> +        goto error;
> +    }
> +    if (virUUIDParse(uuid, def->uuid) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Unable to parse UUID '%s'"), uuid);
> +        goto error;
> +    }
> +
> +    def->ownername = virXPathString("string(./owner/name)", ctxt);
> +    if (!def->ownername) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "%s", _("network port has no owner name"));
> +        goto error;
> +    }
> +
> +    VIR_FREE(uuid);
> +    uuid = virXPathString("string(./owner/uuid)", ctxt);
> +    if (!uuid) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "%s", _("network port has no owner UUID"));
> +        goto error;
> +    }
> +
> +    if (virUUIDParse(uuid, def->owneruuid) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Unable to parse UUID '%s'"), uuid);
> +        goto error;
> +    }
> +
> +    def->group = virXPathString("string(./group)", ctxt);
> +
> +    virtPortNode = virXPathNode("./virtualport", ctxt);
> +    if (virtPortNode &&
> +        (!(def->virtPortProfile = virNetDevVPortProfileParse(virtPortNode, 0)))) {
> +        goto error;
> +    }
> +
> +    mac = virXPathString("string(./mac/@address)", ctxt);
> +    if (!mac) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "%s", _("network port has no mac"));
> +        goto error;
> +    }
> +    if (virMacAddrParse(mac, &def->mac) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Unable to parse MAC '%s'"), mac);
> +        goto error;
> +    }
> +
> +    bandwidthNode = virXPathNode("./bandwidth", ctxt);
> +    /*
> +     * We don't know if the port will allow the "floor" param or
> +     * not at this stage, so we must just tell virNetDevBandwidthParse
> +     * to allow it regardless. Any bad config must be reported at
> +     * time of use instead.
> +     */
> +    if (bandwidthNode &&
> +        virNetDevBandwidthParse(&def->bandwidth, &def->class_id,
> +                                bandwidthNode, true) < 0)
> +        goto error;
> +
> +    vlanNode = virXPathNode("./vlan", ctxt);
> +    if (vlanNode && virNetDevVlanParse(vlanNode, ctxt, &def->vlan) < 0)
> +        goto error;
> +
> +
> +    trustGuestRxFilters
> +        = virXPathString("string(./rxfilters/@trustGuest)", ctxt);
> +    if (trustGuestRxFilters) {
> +        if ((def->trustGuestRxFilters
> +             = virTristateBoolTypeFromString(trustGuestRxFilters)) <= 0) {
> +            virReportError(VIR_ERR_XML_ERROR,
> +                           _("Invalid guest rx filters trust setting '%s' "),
> +                           trustGuestRxFilters);
> +            goto error;
> +        }
> +    }

Coverity notes @trustGuestRxFilters is not VIR_FREE'd later

Although perhaps this code perhaps should have made use of the
VIR_AUTOFREE macros...

John

> +
> +    plugtype = virXPathString("string(./plug/@type)", ctxt);
> +

[...]




More information about the libvir-list mailing list