From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=58408 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OWARZ-00024F-KD for qemu-devel@nongnu.org; Tue, 06 Jul 2010 11:52:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OWARU-0003Oo-Ci for qemu-devel@nongnu.org; Tue, 06 Jul 2010 11:52:18 -0400 Received: from mail-gy0-f173.google.com ([209.85.160.173]:36030) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OWARU-0003Oh-8y for qemu-devel@nongnu.org; Tue, 06 Jul 2010 11:52:16 -0400 Received: by gyf2 with SMTP id 2so2490362gyf.4 for ; Tue, 06 Jul 2010 08:52:15 -0700 (PDT) Message-ID: <4C334F99.6070508@codemonkey.ws> Date: Tue, 06 Jul 2010 10:45:29 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH][RESEND] qdev-properties: Fix (u)intXX parsers References: <1276878423-19955-1-git-send-email-kwolf@redhat.com> In-Reply-To: <1276878423-19955-1-git-send-email-kwolf@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf Cc: qemu-devel@nongnu.org On 06/18/2010 11:27 AM, 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 > Applied. Thanks. Regards, Anthony Liguori > --- > hw/qdev-properties.c | 50 +++++++++++++++++++++++++++++++++++--------------- > 1 files changed, 35 insertions(+), 15 deletions(-) > > 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; > } > >