network: fix crash when starting a network with no <pf> element

Martin Kletzander pointed out in email that my commit 2a193f64
introduced a crash in networkCreateInterfacePool() during startup of
any network that doesn't have a <pf> subelement of its <forward>
element. He also supplied a patch.

 http://www.redhat.com/archives/libvir-list/2014-August/msg00655.html

I expanded on that patch by cleaning up now-extraneous checks in the
callers of networkCreateInterfacePool().

Fortunately the offending patch hasn't been in any release, and hasn't
been (to my knowledge) backported to any other branch.
This commit is contained in:
Laine Stump 2014-08-14 12:34:23 -04:00
parent 62c817e516
commit 7809615056

View File

@ -2196,6 +2196,9 @@ networkCreateInterfacePool(virNetworkDefPtr netdef)
int ret = -1;
size_t i;
if (netdef->forward.npfs == 0 || netdef->forward.nifs > 0)
return 0;
if ((virNetDevGetVirtualFunctions(netdef->forward.pfs->dev,
&vfNames, &virtFns, &numVirtFns)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@ -2204,7 +2207,6 @@ networkCreateInterfacePool(virNetworkDefPtr netdef)
goto cleanup;
}
netdef->forward.nifs = 0;
if (VIR_ALLOC_N(netdef->forward.ifs, numVirtFns) < 0)
goto cleanup;
@ -3843,10 +3845,8 @@ networkAllocateActualDevice(virDomainDefPtr dom,
virDomainHostdevSubsysPCIBackendType backend;
iface->data.network.actual->type = actualType = VIR_DOMAIN_NET_TYPE_HOSTDEV;
if (netdef->forward.npfs > 0 && netdef->forward.nifs <= 0 &&
networkCreateInterfacePool(netdef) < 0) {
if (networkCreateInterfacePool(netdef) < 0)
goto error;
}
/* pick first dev with 0 connections */
for (i = 0; i < netdef->forward.nifs; i++) {
@ -3978,10 +3978,8 @@ networkAllocateActualDevice(virDomainDefPtr dom,
} else {
/* pick an interface from the pool */
if (netdef->forward.npfs > 0 && netdef->forward.nifs == 0 &&
networkCreateInterfacePool(netdef) < 0) {
if (networkCreateInterfacePool(netdef) < 0)
goto error;
}
/* PASSTHROUGH mode, and PRIVATE Mode + 802.1Qbh both
* require exclusive access to a device, so current
@ -4149,10 +4147,9 @@ networkNotifyActualDevice(virDomainDefPtr dom,
goto success;
}
if (netdef->forward.npfs > 0 && netdef->forward.nifs == 0 &&
networkCreateInterfacePool(netdef) < 0) {
if (networkCreateInterfacePool(netdef) < 0)
goto error;
}
if (netdef->forward.nifs == 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("network '%s' uses a direct or hostdev mode, "