[libvirt] [PATCH] 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 --- 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

On 08/21/2014 11:52 AM, Peter Krempa wrote:
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
ACK Jan

On 08/21/14 15:43, Ján Tomko wrote:
On 08/21/2014 11:52 AM, Peter Krempa wrote:
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
ACK
Jan
Pushed; Thanks. Peter
participants (2)
-
Ján Tomko
-
Peter Krempa