qemu: don't raise error upon interface update without <frames/> for <rx/> in coalesce

With this, incomplete XML without <frames/> for <rx/> in coalesce
won't raise error as before. It will leave the coalesce parameter
empty, thanks to passing it as a parameter and return an integer
to indicate error state - previously it returned pointer (or NULL
for both error and incomplete XML).
I also added a test case to test this functionality in the
qemuxml2xmltest.

The code went through some refactoring:
* change of a condition
* addition of a parameter
* change of order, that allowed removal of VIR_FREE
* removal of redundant labels and variables

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1535930
Signed-off-by: Kristina Hanicova <khanicov@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Kristina Hanicova 2021-03-10 18:01:17 +01:00 committed by Martin Kletzander
parent e2602f2bb1
commit 511bdb0bb2
3 changed files with 26 additions and 16 deletions

View File

@ -7598,11 +7598,11 @@ virDomainNetIPInfoParseXML(const char *source,
} }
static virNetDevCoalescePtr static int
virDomainNetDefCoalesceParseXML(xmlNodePtr node, virDomainNetDefCoalesceParseXML(xmlNodePtr node,
xmlXPathContextPtr ctxt) xmlXPathContextPtr ctxt,
virNetDevCoalescePtr *coalesce)
{ {
virNetDevCoalescePtr ret = NULL;
VIR_XPATH_NODE_AUTORESTORE(ctxt) VIR_XPATH_NODE_AUTORESTORE(ctxt)
unsigned long long tmp = 0; unsigned long long tmp = 0;
g_autofree char *str = NULL; g_autofree char *str = NULL;
@ -7611,15 +7611,13 @@ virDomainNetDefCoalesceParseXML(xmlNodePtr node,
str = virXPathString("string(./rx/frames/@max)", ctxt); str = virXPathString("string(./rx/frames/@max)", ctxt);
if (!str) if (!str)
return NULL; return 0;
ret = g_new0(virNetDevCoalesce, 1);
if (virStrToLong_ullp(str, NULL, 10, &tmp) < 0) { if (virStrToLong_ullp(str, NULL, 10, &tmp) < 0) {
virReportError(VIR_ERR_XML_DETAIL, virReportError(VIR_ERR_XML_DETAIL,
_("cannot parse value '%s' for coalesce parameter"), _("cannot parse value '%s' for coalesce parameter"),
str); str);
goto error; return -1;
} }
if (tmp > UINT32_MAX) { if (tmp > UINT32_MAX) {
@ -7627,15 +7625,13 @@ virDomainNetDefCoalesceParseXML(xmlNodePtr node,
_("value '%llu' is too big for coalesce " _("value '%llu' is too big for coalesce "
"parameter, maximum is '%lu'"), "parameter, maximum is '%lu'"),
tmp, (unsigned long) UINT32_MAX); tmp, (unsigned long) UINT32_MAX);
goto error; return -1;
} }
ret->rx_max_coalesced_frames = tmp;
return ret; *coalesce = g_new0(virNetDevCoalesce, 1);
(*coalesce)->rx_max_coalesced_frames = tmp;
error: return 0;
VIR_FREE(ret);
return NULL;
} }
static void static void
@ -11599,8 +11595,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
node = virXPathNode("./coalesce", ctxt); node = virXPathNode("./coalesce", ctxt);
if (node) { if (node) {
def->coalesce = virDomainNetDefCoalesceParseXML(node, ctxt); if (virDomainNetDefCoalesceParseXML(node, ctxt, &def->coalesce) < 0)
if (!def->coalesce)
goto error; goto error;
} }

View File

@ -55,6 +55,15 @@
</rx> </rx>
</coalesce> </coalesce>
</interface> </interface>
<interface type='network'>
<source network='default'/>
<mac address='52:54:00:e5:48:60'/>
<model type='virtio'/>
<coalesce>
<rx>
</rx>
</coalesce>
</interface>
<serial type='pty'> <serial type='pty'>
<target port='0'/> <target port='0'/>
</serial> </serial>

View File

@ -56,6 +56,12 @@
<model type='virtio'/> <model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</interface> </interface>
<interface type='network'>
<mac address='52:54:00:e5:48:60'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</interface>
<serial type='pty'> <serial type='pty'>
<target type='isa-serial' port='0'> <target type='isa-serial' port='0'>
<model name='isa-serial'/> <model name='isa-serial'/>
@ -68,7 +74,7 @@
<input type='keyboard' bus='ps2'/> <input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/> <audio id='1' type='none'/>
<memballoon model='virtio'> <memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</memballoon> </memballoon>
</devices> </devices>
</domain> </domain>