qemu-block
[Top][All Lists]
Advanced

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

Re: [Qemu-block] [Qemu-devel] [PATCH 21/24] util/cutils: Let qemu_strtos


From: Eric Blake
Subject: Re: [Qemu-block] [Qemu-devel] [PATCH 21/24] util/cutils: Let qemu_strtosz*() optionally reject trailing crap
Date: Fri, 17 Feb 2017 15:21:16 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0

On 02/14/2017 04:26 AM, Markus Armbruster wrote:
> Change the qemu_strtosz() & friends to return -EINVAL when @endptr is
> null and the conversion doesn't consume the string completely.
> Matches how qemu_strtol() & friends work.
> 
> Only test_qemu_strtosz_simple() passes a null @endptr.  No functional
> change there, because its conversion consumes the string.
> 
> Simplify callers that use @endptr only to fail when it doesn't point
> to '\0' to pass a null @endptr instead.
> 
> Cc: Dr. David Alan Gilbert <address@hidden>
> Cc: Eduardo Habkost <address@hidden> (maintainer:X86)
> Cc: Kevin Wolf <address@hidden> (supporter:Block layer core)
> Cc: Max Reitz <address@hidden> (supporter:Block layer core)
> Cc: address@hidden (open list:Block layer core)
> Signed-off-by: Markus Armbruster <address@hidden>
> ---
>  hmp.c               |  6 ++----
>  hw/misc/ivshmem.c   |  6 ++----
>  qapi/opts-visitor.c |  5 ++---
>  qemu-img.c          |  7 +------
>  qemu-io-cmds.c      |  7 +------
>  target/i386/cpu.c   |  5 ++---
>  tests/test-cutils.c |  6 ++++++
>  util/cutils.c       | 14 +++++++++-----
>  8 files changed, 25 insertions(+), 31 deletions(-)

Nice cleanup.

Reviewed-by: Eric Blake <address@hidden>


> +++ b/qemu-img.c
> @@ -370,14 +370,9 @@ static int add_old_style_options(const char *fmt, 
> QemuOpts *opts,
>  
>  static int64_t cvtnum(const char *s)
>  {

> +++ b/qemu-io-cmds.c
> @@ -137,14 +137,9 @@ static char **breakline(char *input, int *count)
>  
>  static int64_t cvtnum(const char *s)
>  {
> -    char *end;

Why do we reimplement cvtnum() as copied static functions instead of
exporting it?  But that would be a separate cleanup (perhaps squashed
into 20/24, where you use cvtnum in qemu-img).

> @@ -217,7 +217,8 @@ static int64_t do_strtosz(const char *nptr, char **end,
>      errno = 0;
>      val = strtod(nptr, &endptr);
>      if (isnan(val) || endptr == nptr || errno != 0) {

Hmm - we explicitly reject "NaN", but not "infinity".  But when strtod()
accepts infinity, ...

> -        goto fail;
> +        retval = -EINVAL;
> +        goto out;
>      }
>      fraction = modf(val, &integral);

then modf() returns 0 with integral left at infinity...

>      if (fraction != 0) {
> @@ -232,17 +233,20 @@ static int64_t do_strtosz(const char *nptr, char **end,
>          assert(mul >= 0);
>      }
>      if (mul == 1 && mul_required) {
> -        goto fail;
> +        retval = -EINVAL;
> +        goto out;
>      }
>      if ((val * mul >= INT64_MAX) || val < 0) {

...and the multiply exceeds INT64_MAX, so we still end up rejecting it
(with ERANGE instead of EINVAL).  Weird way but seems to work, and is
pre-existing, so not this patch's problem.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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