qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH][RESEND] qdev-properties: Fix (u)intXX parsers


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH][RESEND] qdev-properties: Fix (u)intXX parsers
Date: Wed, 30 Jun 2010 22:59:55 +0200
User-agent: Mutt/1.5.20 (2009-06-14)

On Fri, Jun 18, 2010 at 06:27:03PM +0200, Kevin Wolf wrote:
> scanf calls must not use PRI constants, they have probably the wrong size and
> corrupt memory. We could replace them by SCN ones, but strtol is simpler than
> scanf here anyway. While at it, also fix the parsers to reject garbage after
> the number ("4096xyz" was accepted before).
> 
> Signed-off-by: Kevin Wolf <address@hidden>
> ---
>  hw/qdev-properties.c |   50 
> +++++++++++++++++++++++++++++++++++---------------
>  1 files changed, 35 insertions(+), 15 deletions(-)

Thanks, applied.

> diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
> index 5a8739d..5b7fd77 100644
> --- a/hw/qdev-properties.c
> +++ b/hw/qdev-properties.c
> @@ -67,12 +67,14 @@ PropertyInfo qdev_prop_bit = {
>  static int parse_uint8(DeviceState *dev, Property *prop, const char *str)
>  {
>      uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
> -    const char *fmt;
> +    char *end;
>  
>      /* accept both hex and decimal */
> -    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx8 : "%" PRIu8;
> -    if (sscanf(str, fmt, ptr) != 1)
> +    *ptr = strtoul(str, &end, 0);
> +    if ((*end != '\0') || (end == str)) {
>          return -EINVAL;
> +    }
> +
>      return 0;
>  }
>  
> @@ -95,12 +97,14 @@ PropertyInfo qdev_prop_uint8 = {
>  static int parse_uint16(DeviceState *dev, Property *prop, const char *str)
>  {
>      uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
> -    const char *fmt;
> +    char *end;
>  
>      /* accept both hex and decimal */
> -    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx16 : "%" PRIu16;
> -    if (sscanf(str, fmt, ptr) != 1)
> +    *ptr = strtoul(str, &end, 0);
> +    if ((*end != '\0') || (end == str)) {
>          return -EINVAL;
> +    }
> +
>      return 0;
>  }
>  
> @@ -123,12 +127,14 @@ PropertyInfo qdev_prop_uint16 = {
>  static int parse_uint32(DeviceState *dev, Property *prop, const char *str)
>  {
>      uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
> -    const char *fmt;
> +    char *end;
>  
>      /* accept both hex and decimal */
> -    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx32 : "%" PRIu32;
> -    if (sscanf(str, fmt, ptr) != 1)
> +    *ptr = strtoul(str, &end, 0);
> +    if ((*end != '\0') || (end == str)) {
>          return -EINVAL;
> +    }
> +
>      return 0;
>  }
>  
> @@ -149,9 +155,13 @@ PropertyInfo qdev_prop_uint32 = {
>  static int parse_int32(DeviceState *dev, Property *prop, const char *str)
>  {
>      int32_t *ptr = qdev_get_prop_ptr(dev, prop);
> +    char *end;
>  
> -    if (sscanf(str, "%" PRId32, ptr) != 1)
> +    *ptr = strtol(str, &end, 10);
> +    if ((*end != '\0') || (end == str)) {
>          return -EINVAL;
> +    }
> +
>      return 0;
>  }
>  
> @@ -174,9 +184,13 @@ PropertyInfo qdev_prop_int32 = {
>  static int parse_hex32(DeviceState *dev, Property *prop, const char *str)
>  {
>      uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
> +    char *end;
>  
> -    if (sscanf(str, "%" PRIx32, ptr) != 1)
> +    *ptr = strtoul(str, &end, 16);
> +    if ((*end != '\0') || (end == str)) {
>          return -EINVAL;
> +    }
> +
>      return 0;
>  }
>  
> @@ -199,12 +213,14 @@ PropertyInfo qdev_prop_hex32 = {
>  static int parse_uint64(DeviceState *dev, Property *prop, const char *str)
>  {
>      uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
> -    const char *fmt;
> +    char *end;
>  
>      /* accept both hex and decimal */
> -    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx64 : "%" PRIu64;
> -    if (sscanf(str, fmt, ptr) != 1)
> +    *ptr = strtoull(str, &end, 0);
> +    if ((*end != '\0') || (end == str)) {
>          return -EINVAL;
> +    }
> +
>      return 0;
>  }
>  
> @@ -227,9 +243,13 @@ PropertyInfo qdev_prop_uint64 = {
>  static int parse_hex64(DeviceState *dev, Property *prop, const char *str)
>  {
>      uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
> +    char *end;
>  
> -    if (sscanf(str, "%" PRIx64, ptr) != 1)
> +    *ptr = strtoull(str, &end, 16);
> +    if ((*end != '\0') || (end == str)) {
>          return -EINVAL;
> +    }
> +
>      return 0;
>  }
>  
> -- 
> 1.6.6.1
> 
> 
> 

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
address@hidden                 http://www.aurel32.net



reply via email to

[Prev in Thread] Current Thread [Next in Thread]