From: Laine Stump Date: Thu, 14 Aug 2014 16:34:23 +0000 (-0400) Subject: network: fix crash when starting a network with no element X-Git-Tag: v1.2.8-rc1~172 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=78096150569ff82994979b05119d9ebeccdabd2e;p=thirdparty%2Flibvirt.git network: fix crash when starting a network with no 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 subelement of its 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. --- diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 1ba4c3d127..9491c5173b 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -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, "