[libvirt PATCH 03/10] virDomainGraphicsDefParseXMLSpice: Use virXMLProp*

Peter Krempa pkrempa at redhat.com
Mon Apr 26 09:42:35 UTC 2021


On Fri, Apr 23, 2021 at 17:39:16 +0200, Tim Wiederhake wrote:
> Signed-off-by: Tim Wiederhake <twiederh at redhat.com>
> ---
>  src/conf/domain_conf.c | 251 ++++++++++-------------------------------
>  1 file changed, 59 insertions(+), 192 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index d57450b3c0..9aba2edf0a 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -12969,200 +12950,86 @@ virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDef *def,
>      while (cur != NULL) {
>          if (cur->type == XML_ELEMENT_NODE) {
>              if (virXMLNodeNameEqual(cur, "channel")) {
> -                int nameval, modeval;
> -                g_autofree char *name = NULL;
> -                g_autofree char *mode = NULL;
> -
> -                name = virXMLPropString(cur, "name");
> -                mode = virXMLPropString(cur, "mode");
> +                virDomainGraphicsSpiceChannelName name;
> +                virDomainGraphicsSpiceChannelMode mode;


I'm not entirely sure that all static analyzers will be able to see that
'name' and 'mode'...

>  
> -                if (!name || !mode) {
> -                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                                   _("spice channel missing name/mode"));
> +                if (virXMLPropEnum(cur, "name",
> +                                   virDomainGraphicsSpiceChannelNameTypeFromString,
> +                                   VIR_XML_PROP_REQUIRED, &name) < 0)
>                      return -1;
> -                }
>  
> -                if ((nameval = virDomainGraphicsSpiceChannelNameTypeFromString(name)) < 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                                   _("unknown spice channel name %s"),
> -                                   name);
> -                    return -1;
> -                }
> -                if ((modeval = virDomainGraphicsSpiceChannelModeTypeFromString(mode)) < 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                                   _("unknown spice channel mode %s"),
> -                                   mode);
> +                if (virXMLPropEnum(cur, "mode",
> +                                   virDomainGraphicsSpiceChannelModeTypeFromString,
> +                                   VIR_XML_PROP_REQUIRED, &mode) < 0)

... will not be uninitalized if virXMLPropEnum returns since
VIR_XML_PROP_REQUIRED is used, but the code is correct.


>                      return -1;
> -                }
>  
> -                def->data.spice.channels[nameval] = modeval;
> +                def->data.spice.channels[name] = mode;
>              } else if (virXMLNodeNameEqual(cur, "image")) {
> -                int compressionVal;
> -                g_autofree char *compression = virXMLPropString(cur, "compression");
> +                virDomainGraphicsSpiceImageCompression compression;
>  
> -                if (!compression) {
> -                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                                   _("spice image missing compression"));
> +                if (virXMLPropEnum(cur, "compression",
> +                                   virDomainGraphicsSpiceImageCompressionTypeFromString,
> +                                   VIR_XML_PROP_REQUIRED, &compression) < 0)

The removed function was checking '<= 0' thus VIR_XML_PROP_NONZERO is
missing. 

>                      return -1;
> -                }
>  
> -                if ((compressionVal =
> -                     virDomainGraphicsSpiceImageCompressionTypeFromString(compression)) <= 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                                   _("unknown spice image compression %s"),
> -                                   compression);
> -                    return -1;
> -                }
> -
> -                def->data.spice.image = compressionVal;
> +                def->data.spice.image = compression;
>              } else if (virXMLNodeNameEqual(cur, "jpeg")) {
> -                int compressionVal;
> -                g_autofree char *compression = virXMLPropString(cur, "compression");
> +                virDomainGraphicsSpiceJpegCompression compression;
>  
> -                if (!compression) {
> -                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                                   _("spice jpeg missing compression"));
> +                if (virXMLPropEnum(cur, "compression",
> +                                   virDomainGraphicsSpiceJpegCompressionTypeFromString,
> +                                   VIR_XML_PROP_REQUIRED, &compression) < 0)
>                      return -1;


Here too.

> -                }
>  
> -                if ((compressionVal =
> -                     virDomainGraphicsSpiceJpegCompressionTypeFromString(compression)) <= 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                                   _("unknown spice jpeg compression %s"),
> -                                   compression);
> -                    return -1;
> -                }
> -
> -                def->data.spice.jpeg = compressionVal;
> +                def->data.spice.jpeg = compression;
>              } else if (virXMLNodeNameEqual(cur, "zlib")) {
> -                int compressionVal;
> -                g_autofree char *compression = virXMLPropString(cur, "compression");
> -
> -                if (!compression) {
> -                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                                   _("spice zlib missing compression"));
> -                    return -1;
> -                }
> +                virDomainGraphicsSpiceZlibCompression compression;
>  
> -                if ((compressionVal =
> -                     virDomainGraphicsSpiceZlibCompressionTypeFromString(compression)) <= 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                                   _("unknown spice zlib compression %s"),
> -                                   compression);
> +                if (virXMLPropEnum(cur, "compression",
> +                                   virDomainGraphicsSpiceZlibCompressionTypeFromString,
> +                                   VIR_XML_PROP_REQUIRED, &compression) < 0)

... and here too.

>                      return -1;
> -                }
>  
> -                def->data.spice.zlib = compressionVal;
> +                def->data.spice.zlib = compression;
>              } else if (virXMLNodeNameEqual(cur, "playback")) {
> -                int compressionVal;
> -                g_autofree char *compression = virXMLPropString(cur, "compression");
> -
> -                if (!compression) {
> -                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                                   _("spice playback missing compression"));
> -                    return -1;
> -                }
> -
> -                if ((compressionVal =
> -                     virTristateSwitchTypeFromString(compression)) <= 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                                   _("unknown spice playback compression"));
> +                if (virXMLPropTristateSwitch(cur, "compression",
> +                                             VIR_XML_PROP_REQUIRED,
> +                                             &def->data.spice.playback) < 0)
>                      return -1;
> -                }
>  
> -                def->data.spice.playback = compressionVal;
>              } else if (virXMLNodeNameEqual(cur, "streaming")) {
> -                int modeVal;
> -                g_autofree char *mode = virXMLPropString(cur, "mode");
> +                virDomainGraphicsSpiceStreamingMode mode;
>  
> -                if (!mode) {
> -                    virReportError(VIR_ERR_XML_ERROR, "%s",
> -                                   _("spice streaming missing mode"));
> -                    return -1;
> -                }
> -                if ((modeVal =
> -                     virDomainGraphicsSpiceStreamingModeTypeFromString(mode)) <= 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                                   _("unknown spice streaming mode"));
> +                if (virXMLPropEnum(cur, "mode",
> +                                   virDomainGraphicsSpiceStreamingModeTypeFromString,
> +                                   VIR_XML_PROP_REQUIRED, &mode) < 0)


... and here as well.

>                      return -1;
> -                }
>  
> -                def->data.spice.streaming = modeVal;
> +                def->data.spice.streaming = mode;
>              } else if (virXMLNodeNameEqual(cur, "clipboard")) {
> -                int copypasteVal;
> -                g_autofree char *copypaste = virXMLPropString(cur, "copypaste");
> -
> -                if (!copypaste) {
> -                    virReportError(VIR_ERR_XML_ERROR, "%s",
> -                                   _("spice clipboard missing copypaste"));
> +                if (virXMLPropTristateBool(cur, "copypaste",
> +                                           VIR_XML_PROP_REQUIRED,
> +                                           &def->data.spice.copypaste) < 0)
>                      return -1;
> -                }
> -
> -                if ((copypasteVal =
> -                     virTristateBoolTypeFromString(copypaste)) <= 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                                   _("unknown copypaste value '%s'"), copypaste);
> -                    return -1;
> -                }
> -
> -                def->data.spice.copypaste = copypasteVal;
>              } else if (virXMLNodeNameEqual(cur, "filetransfer")) {
> -                int enableVal;
> -                g_autofree char *enable = virXMLPropString(cur, "enable");
> -
> -                if (!enable) {
> -                    virReportError(VIR_ERR_XML_ERROR, "%s",
> -                                   _("spice filetransfer missing enable"));
> +                if (virXMLPropTristateBool(cur, "enable",
> +                                           VIR_XML_PROP_REQUIRED,
> +                                           &def->data.spice.filetransfer) < 0)
>                      return -1;
> -                }
> -
> -                if ((enableVal =
> -                     virTristateBoolTypeFromString(enable)) <= 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                                   _("unknown enable value '%s'"), enable);
> -                    return -1;
> -                }
> -
> -                def->data.spice.filetransfer = enableVal;
>              } else if (virXMLNodeNameEqual(cur, "gl")) {
> -                int enableVal;
> -                g_autofree char *enable = virXMLPropString(cur, "enable");
> -                g_autofree char *rendernode = virXMLPropString(cur, "rendernode");
> +                def->data.spice.rendernode = virXMLPropString(cur,
> +                                                              "rendernode");

Don't break the line here. 80 cols is not a hard limit.

>  
> -                if (!enable) {
> -                    virReportError(VIR_ERR_XML_ERROR, "%s",
> -                                   _("spice gl element missing enable"));
> -                    return -1;
> -                }
> -
> -                if ((enableVal =
> -                     virTristateBoolTypeFromString(enable)) <= 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                                   _("unknown enable value '%s'"), enable);
> +                if (virXMLPropTristateBool(cur, "enable",
> +                                           VIR_XML_PROP_REQUIRED,
> +                                           &def->data.spice.gl) < 0)
>                      return -1;
> -                }
> -
> -                def->data.spice.gl = enableVal;
> -                def->data.spice.rendernode = g_steal_pointer(&rendernode);
> -
>              } else if (virXMLNodeNameEqual(cur, "mouse")) {
> -                int modeVal;
> -                g_autofree char *mode = virXMLPropString(cur, "mode");
> -
> -                if (!mode) {
> -                    virReportError(VIR_ERR_XML_ERROR, "%s",
> -                                   _("spice mouse missing mode"));
> +                if (virXMLPropEnum(cur, "mode",
> +                                   virDomainGraphicsSpiceMouseModeTypeFromString,
> +                                   VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
> +                                   &def->data.spice.mousemode) < 0)
>                      return -1;
> -                }
> -
> -                if ((modeVal = virDomainGraphicsSpiceMouseModeTypeFromString(mode)) <= 0) {
> -                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                                   _("unknown mouse mode value '%s'"),
> -                                   mode);
> -                    return -1;
> -                }
> -
> -                def->data.spice.mousemode = modeVal;
>              }
>          }
>          cur = cur->next;
> -- 
> 2.26.3
> 




More information about the libvir-list mailing list