[libvirt] [PATCH v2 4/5] conf: report errors when parsing video resolution
Jonathon Jongsma
jjongsma at redhat.com
Wed Nov 13 22:41:28 UTC 2019
On Wed, 2019-11-13 at 13:54 -0500, Cole Robinson wrote:
> I pushed the first three patches. Comments below
>
> On 10/23/19 1:46 PM, Jonathon Jongsma wrote:
> > The current code doesn't properly handle errors when parsing a
> > video
> > device's resolution.
> >
> > This patch changes the parse function signature to return an error
> > when we're missing an 'x' or 'y' parameter or when the 'x' or 'y'
> > parameters are not positive integers. No error is returned when no
> > 'resolution' element is found.
> >
> > Previously we were returning a NULL structure for the case where
> > 'x' or
> > 'y' were missing, but were returning an under-specified structure
> > for
> > the other error cases.
> >
> > Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> > ---
> > src/conf/domain_conf.c | 44 ++++++++++++++++++++++++++++--------
> > ------
> > 1 file changed, 30 insertions(+), 14 deletions(-)
> >
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 269a6ec2c3..b3f32d0b63 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -15338,45 +15338,57 @@ virDomainVideoAccelDefParseXML(xmlNodePtr
> > node)
> > return g_steal_pointer(&def);
> > }
> >
> > -static virDomainVideoResolutionDefPtr
> > -virDomainVideoResolutionDefParseXML(xmlNodePtr node)
> > +static int
> > +virDomainVideoResolutionDefParseXML(xmlNodePtr node,
> > + virDomainVideoResolutionDefPtr
> > *res)
> > {
> > xmlNodePtr cur;
> > g_autofree virDomainVideoResolutionDefPtr def = NULL;
> > g_autofree char *x = NULL;
> > g_autofree char *y = NULL;
> >
> > + *res = NULL;
> > cur = node->children;
> > while (cur != NULL) {
> > - if (cur->type == XML_ELEMENT_NODE) {
> > - if (!x && !y &&
> > - virXMLNodeNameEqual(cur, "resolution")) {
> > - x = virXMLPropString(cur, "x");
> > - y = virXMLPropString(cur, "y");
> > - }
> > + if ((cur->type == XML_ELEMENT_NODE) &&
> > + virXMLNodeNameEqual(cur, "resolution")) {
> > + x = virXMLPropString(cur, "x");
> > + y = virXMLPropString(cur, "y");
> > + break;
> > }
> > cur = cur->next;
> > }
> >
>
> This loop can be removed if you move the virXMLNodeNameEqual to the
> parent function, like how it is handled for parent call of
> virDomainVirtioOptionsParseXML
>
> > + /* resolution not specified */
> > + if (cur == NULL)
> > + return 0;
> > +
> > + /* resolution specified, but x or y is missing. report error
> > */
> > if (!x || !y)
> > - return NULL;
> > + return -1;
> >
> > def = g_new0(virDomainVideoResolutionDef, 1);
> >
> > if (virStrToLong_uip(x, NULL, 10, &def->x) < 0) {
> > virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > _("cannot parse video x-resolution '%s'"),
> > x);
> > - goto cleanup;
> > + return -1;
> > }
> >
> > if (virStrToLong_uip(y, NULL, 10, &def->y) < 0) {
> > virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > _("cannot parse video y-resolution '%s'"),
> > y);
> > - goto cleanup;
> > + return -1;
> > }
> >
> > - cleanup:
> > - return g_steal_pointer(&def);
> > + if (def->x == 0 || def->y == 0) {
> > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> > + _("resolution values must be greater than
> > 0"));
> > + return -1;
> > + }
> > +
> > + *res = g_steal_pointer(&def);
> > + return 0;
> > }
> >
>
> This patch is doing two things: converting to the more common error
> handling pattern, but also adding this error check. Separating them
> will
> help review.
>
> It's borderline pedantic but this type of error should actually be in
> the Validate callback machinery instead. Some drivers will fill in a
> virDomainDef manually in code (like virtualbox). If they accidentally
> set an x or y value of 0, Validate won't catch it as an error, but
> the
> XML parser will catch it later. Generally the XML parser should only
> throw errors about
It seems that this sentence is unfinished?
>
> > static virDomainVideoDriverDefPtr
> > @@ -15458,7 +15470,11 @@
> > virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
> > }
> >
> > def->accel = virDomainVideoAccelDefParseXML(cur);
> > - def->res =
> > virDomainVideoResolutionDefParseXML(cur);
> > + if (virDomainVideoResolutionDefParseXML(cur, &def-
> > >res) < 0) {
> > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > + "%s", _("Cannot parse video
> > resolution"));
> > + goto error;
> > + }
> > }
>
> Calling virReporError here will overwrite the error raised by
> virDomainVideoResolutionDefParseXML. The error reporting machinery
> doesn't have any smarts to merge errors or anything like that, it
> needs
> to be done manually. In this case you can just drop the
> virReportError
> entirely
>
> I'll be quicker about reviewing v3.
>
> Thanks,
> Cole
More information about the libvir-list
mailing list