[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