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 --- The parser would be better of with a refactor. This is a minimal change to fix the crash. src/conf/network_conf.c | 5 ++--- tests/networkxml2xmlin/passthrough-address-crash.xml | 7 +++++++ tests/networkxml2xmlout/passthrough-address-crash.xml | 7 +++++++ tests/networkxml2xmltest.c | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 tests/networkxml2xmlin/passthrough-address-crash.xml create mode 100644 tests/networkxml2xmlout/passthrough-address-crash.xml diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 756b9de..dc25c6e 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -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, diff --git a/tests/networkxml2xmlin/passthrough-address-crash.xml b/tests/networkxml2xmlin/passthrough-address-crash.xml new file mode 100644 index 0000000..a05dbbf --- /dev/null +++ b/tests/networkxml2xmlin/passthrough-address-crash.xml @@ -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> diff --git a/tests/networkxml2xmlout/passthrough-address-crash.xml b/tests/networkxml2xmlout/passthrough-address-crash.xml new file mode 100644 index 0000000..a05dbbf --- /dev/null +++ b/tests/networkxml2xmlout/passthrough-address-crash.xml @@ -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> diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c index c6e0f6f..65ac591 100644 --- a/tests/networkxml2xmltest.c +++ b/tests/networkxml2xmltest.c @@ -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; } -- 2.0.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list