On 03/21/2013 03:50 PM, Jim Fehlig wrote:
Noticed that parsing bond interface XML containing the miimon
element
fails
<interface type="bond" name="bond0">
...
<bond mode="active-backup">
<miimon freq="100" carrier="netif"/>
...
</bond>
</interface>
This configuration does not contain the optional updelay and downdelay
attributes, but parsing will fail due to returning the result of
virXPathULong (a -1 when the attribute doesn't exist) from
virInterfaceDefParseBond after examining the updelay attribute.
I considered just adding a ret = 0; near the bottom of
virInterfaceDefParseBond, but see there is no cleanup in the error
label. Instead, just return failure where failure occurs and
return success if the end of the function is reached.
---
virInterfaceDefParseBond(virInterfaceDefPtr def,
xmlXPathContextPtr ctxt) {
- int ret = -1;
+ int res;
unsigned long tmp;
Pre-existing, but this is a long...
if (virXPathNode("./miimon[1]", ctxt) != NULL) {
def->data.bond.monit = VIR_INTERFACE_BOND_MONIT_MII;
- ret = virXPathULong("string(./miimon/@freq)", ctxt, &tmp);
- if ((ret == -2) || (ret == -1)) {
+ res = virXPathULong("string(./miimon/@freq)", ctxt, &tmp);
+ if ((res == -2) || (res == -1)) {
virReportError(VIR_ERR_XML_ERROR,
"%s", _("bond interface miimon freq missing or
invalid"));
- goto error;
+ return -1;
}
def->data.bond.frequency = (int) tmp;
yet here we want it to be an int. Why not use virXPathInt() on an int
in the first place, so that we don't risk silent truncation? In fact,
why even have tmp, when we can:
ret = virXPathInt("string(./miimon/@freq)", ctxt,
&def->data.bond.frequency)
in the first place?
As long as we are cleaning up this function, we might as well clean up
the unintentional silent truncation.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org