conf: net: Correctly switch how to format address fields

When formatting the forward mode addresses or interfaces the switch was
done based on the type of the network rather than of the type of the
individual <interface>/<address> element. In case a user would specify
an incorrect network type ("passhtrough") with <address> elements,
libvirtd would crash as it would attempt to format an <interface>.

Use the type of the individual element to format the XML.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1132347
This commit is contained in:
Peter Krempa 2014-08-21 11:06:37 +02:00
parent b2e87c3628
commit 4cf1c3fab1
4 changed files with 17 additions and 3 deletions

View File

@ -2731,7 +2731,7 @@ virNetworkDefFormatBuf(virBufferPtr buf,
if (def->forward.nifs &&
(!def->forward.npfs || !(flags & VIR_NETWORK_XML_INACTIVE))) {
for (i = 0; i < def->forward.nifs; i++) {
if (def->forward.type != VIR_NETWORK_FORWARD_HOSTDEV) {
if (def->forward.ifs[i].type == VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV) {
virBufferEscapeString(buf, "<interface dev='%s'",
def->forward.ifs[i].device.dev);
if (!(flags & VIR_NETWORK_XML_INACTIVE) &&
@ -2740,8 +2740,7 @@ virNetworkDefFormatBuf(virBufferPtr buf,
def->forward.ifs[i].connections);
}
virBufferAddLit(buf, "/>\n");
}
else {
} else {
if (def->forward.ifs[i].type == VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_PCI) {
if (virDevicePCIAddressFormat(buf,
def->forward.ifs[i].device.pci,

View File

@ -0,0 +1,7 @@
<network>
<name>passthrough_001</name>
<uuid>50e92386-8dd1-4a95-8a4b-9a888274eb66</uuid>
<forward mode='passthrough'>
<address type='pci' domain='0x0000' bus='0x11' slot='0x10' function='0x1'/>
</forward>
</network>

View File

@ -0,0 +1,7 @@
<network>
<name>passthrough_001</name>
<uuid>50e92386-8dd1-4a95-8a4b-9a888274eb66</uuid>
<forward mode='passthrough'>
<address type='pci' domain='0x0000' bus='0x11' slot='0x10' function='0x1'/>
</forward>
</network>

View File

@ -119,6 +119,7 @@ mymain(void)
DO_TEST_FULL("passthrough-pf", VIR_NETWORK_XML_INACTIVE);
DO_TEST("hostdev");
DO_TEST_FULL("hostdev-pf", VIR_NETWORK_XML_INACTIVE);
DO_TEST("passthrough-address-crash");
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}