[libvirt] [PATCH v2 5/5] conf: report errors when parsing video acceleration
Cole Robinson
crobinso at redhat.com
Wed Nov 13 18:56:48 UTC 2019
On 10/23/19 1:46 PM, Jonathon Jongsma wrote:
> In order to differentiate between a configuration that does not specify
> any video acceleration and one that is incorrectly specified, change the
> signature of virDomainVideoAccelDefParseXML() to return an error
> response.
>
> If any of the values are invalid, report an error rather than returning
> a partially-specified accel object. If no 'acceleration' node is found,
> do not report an error since it is optional.
>
> Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> ---
> src/conf/domain_conf.c | 38 +++++++++++++++++++++++---------------
> 1 file changed, 23 insertions(+), 15 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index b3f32d0b63..1c3fc5c4ce 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -15285,8 +15285,8 @@ virDomainVideoDefaultType(const virDomainDef *def)
> }
> }
>
> -static virDomainVideoAccelDefPtr
> -virDomainVideoAccelDefParseXML(xmlNodePtr node)
> +static int
> +virDomainVideoAccelDefParseXML(xmlNodePtr node, virDomainVideoAccelDefPtr *accel)
> {
> xmlNodePtr cur;
> g_autofree virDomainVideoAccelDefPtr def = NULL;
> @@ -15295,21 +15295,25 @@ virDomainVideoAccelDefParseXML(xmlNodePtr node)
> g_autofree char *accel3d = NULL;
> g_autofree char *rendernode = NULL;
>
> + *accel = NULL;
> cur = node->children;
> while (cur != NULL) {
> - if (cur->type == XML_ELEMENT_NODE) {
> - if (!accel3d && !accel2d &&
> - virXMLNodeNameEqual(cur, "acceleration")) {
> - accel3d = virXMLPropString(cur, "accel3d");
> - accel2d = virXMLPropString(cur, "accel2d");
> - rendernode = virXMLPropString(cur, "rendernode");
> - }
> + if ((cur->type == XML_ELEMENT_NODE) &&
> + virXMLNodeNameEqual(cur, "acceleration")) {
> + accel3d = virXMLPropString(cur, "accel3d");
> + accel2d = virXMLPropString(cur, "accel2d");
> + rendernode = virXMLPropString(cur, "rendernode");
> + break;
> }
> cur = cur->next;
> }
>
THe virXMLNodeNameEqual check should be moved to the parent, same as
mentioned in patch 4
> + /* no acceleration node was specified */
> + if (cur == NULL)
> + return 0;
> +
> if (!accel3d && !accel2d && !rendernode)
> - return NULL;
> + return -1;
>
> def = g_new0(virDomainVideoAccelDef, 1);
>
> @@ -15317,7 +15321,7 @@ virDomainVideoAccelDefParseXML(xmlNodePtr node)
> if ((val = virTristateBoolTypeFromString(accel3d)) <= 0) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> _("unknown accel3d value '%s'"), accel3d);
> - goto cleanup;
> + return -1;
> }
> def->accel3d = val;
> }
> @@ -15326,7 +15330,7 @@ virDomainVideoAccelDefParseXML(xmlNodePtr node)
> if ((val = virTristateBoolTypeFromString(accel2d)) <= 0) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> _("unknown accel2d value '%s'"), accel2d);
> - goto cleanup;
> + return -1;
> }
> def->accel2d = val;
> }
> @@ -15334,8 +15338,8 @@ virDomainVideoAccelDefParseXML(xmlNodePtr node)
> if (rendernode)
> def->rendernode = virFileSanitizePath(rendernode);
>
> - cleanup:
> - return g_steal_pointer(&def);
> + *accel = g_steal_pointer(&def);
> + return 0;
> }
>
> static int
> @@ -15469,7 +15473,11 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
> VIR_FREE(primary);
> }
>
> - def->accel = virDomainVideoAccelDefParseXML(cur);
> + if (virDomainVideoAccelDefParseXML(cur, &def->accel) < 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + "%s", _("Cannot parse video acceleration"));
> + goto error;
> + }
> if (virDomainVideoResolutionDefParseXML(cur, &def->res) < 0) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> "%s", _("Cannot parse video resolution"));
>
Same error overwriting issue here as in patch 4
- Cole
More information about the libvir-list
mailing list