[libvirt] [PATCH 3/3] Rewrite usb device version parsing
Peter Krempa
pkrempa at redhat.com
Mon Apr 13 07:50:34 UTC 2015
On Fri, Apr 10, 2015 at 16:28:24 +0200, Ján Tomko wrote:
> Simplify the function by leaving out the local copy and checking
> return values of virStrToLong.
> ---
> src/conf/domain_conf.c | 66 +++++++++++++++-----------------------------------
> 1 file changed, 20 insertions(+), 46 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 65e2bac..bea98a1 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -11306,66 +11306,40 @@ virDomainRedirdevDefParseXML(xmlNodePtr node,
> }
>
> /*
> - * This is the helper function to convert USB version from a
> + * This is the helper function to convert USB device version from a
> * format of JJ.MN to a format of 0xJJMN where JJ is the major
> * version number, M is the minor version number and N is the
> * sub minor version number.
> - * e.g. USB 2.0 is reported as 0x0200,
> - * USB 1.1 as 0x0110 and USB 1.0 as 0x0100.
> + * e.g. USB version 2.0 is reported as 0x0200,
> + * USB version 4.07 as 0x0407
> */
> static int
> virDomainRedirFilterUSBVersionHelper(const char *version,
> virDomainRedirFilterUSBDevDefPtr def)
> {
> - char *version_copy = NULL;
> - char *temp = NULL;
> - int ret = -1;
> - size_t len;
> - size_t fraction_len;
> - unsigned int major;
> - unsigned int minor;
> - unsigned int hex;
> -
> - if (VIR_STRDUP(version_copy, version) < 0)
> - return -1;
> + unsigned int major, minor;
> + char *s = NULL;
>
> - len = strlen(version_copy);
> - /*
> - * The valid format of version is like 01.10, 1.10, 1.1, etc.
> - */
> - if (len > 5 ||
> - !(temp = strchr(version_copy, '.')) ||
> - temp - version_copy < 1 ||
> - temp - version_copy > 2 ||
> - !(fraction_len = strlen(temp + 1)) ||
> - fraction_len > 2) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("Incorrect USB version format %s"), version);
> - goto cleanup;
> - }
> + if ((virStrToLong_ui(version, &s, 10, &major)) < 0 ||
> + *s++ != '.' ||
> + (virStrToLong_ui(s, NULL, 10, &minor)) < 0)
> + goto error;
>
> - *temp = '\0';
> - temp++;
> + if (major >= 100 || minor >= 100)
> + goto error;
>
> - if ((virStrToLong_ui(version_copy, NULL, 10, &major)) < 0 ||
> - (virStrToLong_ui(temp, NULL, 10, &minor)) < 0) {
> - virReportError(VIR_ERR_XML_ERROR,
> - _("Cannot parse USB version %s"), version);
> - goto cleanup;
> - }
> + if (strlen(s) == 1)
> + minor *= 10;
Humm, do we really want to fix user input in this case? I think that it
makes sense but a comment explaining what that part does would be
actually helpful.
>
> - hex = (major / 10) << 12 | (major % 10) << 8;
> - if (fraction_len == 1)
> - hex |= (minor % 10) << 4;
> - else
> - hex |= (minor / 10) << 4 | (minor % 10) << 0;
> + def->version = (major / 10) << 12 | (major % 10) << 8 |
> + (minor / 10) << 4 | (minor % 10) << 0;
>
> - def->version = hex;
> - ret = 0;
> + return 0;
>
> - cleanup:
> - VIR_FREE(version_copy);
> - return ret;
> + error:
> + virReportError(VIR_ERR_XML_ERROR,
> + _("Cannot parse USB device version %s"), version);
> + return -1;
> }
ACK with the comment added. It looks much better now.
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150413/1064425f/attachment-0001.sig>
More information about the libvir-list
mailing list