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