qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>, qemu-devel@nongnu.org
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
	"Markus Armbruster" <armbru@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v4 2/9] cutils: add qemu_strtoi & qemu_strtoui parsers for int/unsigned int types
Date: Mon, 5 Feb 2018 13:37:21 -0600	[thread overview]
Message-ID: <8ab20df7-a6fe-7dca-d6c3-f3ab33f78550@redhat.com> (raw)
In-Reply-To: <20180205152455.12088-3-berrange@redhat.com>

On 02/05/2018 09:24 AM, Daniel P. Berrangé wrote:
> From: "Daniel P. Berrange" <berrange@redhat.com>
> 
> There are qemu_strtoNN functions for various sized integers. This adds two
> more for plain int & unsigned int types, with suitable range checking.
> 
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> ---

> +++ b/util/cutils.c
> @@ -297,6 +297,110 @@ static int check_strtox_error(const char *nptr, char *ep,
>       return -libc_errno;
>   }
>   
> +/**
> + * Convert string @nptr to a long integer, and store it in @result.

s/a long/an/

> + */
> +int qemu_strtoi(const char *nptr, const char **endptr, int base,
> +                int *result)
> +{
> +    char *ep;
> +    long lresult;
> +
> +    if (!nptr) {
> +        if (endptr) {
> +            *endptr = nptr;
> +        }
> +        return -EINVAL;
> +    }
> +
> +    errno = 0;
> +    lresult = strtol(nptr, &ep, base);
> +    if (lresult < INT_MIN) {
> +        *result = INT_MIN;
> +    } else if (lresult > INT_MAX) {
> +        *result = INT_MAX;

On 64-bit platforms, this clamps the result, but does not set errno, for 
values beyond int but still within the range of long.  Which is 
different than what it does on 32-bit platforms.  Gross.  The testsuite 
is missing coverage of this, which ideally would be the same behavior 
(setting errno=ERANGE) on both platforms.

> +    } else {
> +        *result = lresult;
> +    }
> +    return check_strtox_error(nptr, ep, endptr, errno);
> +}
> +
> +/**
> + * Convert string @nptr to an unsigned int, and store it in @result.

> + * Note that a number with a leading minus sign gets converted without
> + * the minus sign, checked for overflow (see above), then negated (in
> + * @result's type).  This is exactly how strtoul() works.
> + */
> +int qemu_strtoui(const char *nptr, const char **endptr, int base,
> +                 unsigned int *result)
> +{

> +
> +    errno = 0;
> +    lresult = strtol(nptr, &ep, base);
> +    /* Windows returns 1 for negative out-of-range values.  */
> +    if (errno == ERANGE) {
> +        *result = -1;
> +    } else {
> +        if (lresult > UINT_MAX) {
> +            *result = UINT_MAX;
> +        } else if (lresult < INT_MIN) {
> +            *result = UINT_MAX;

Again, an unfortunate difference between 32- and 64-bit platforms on 
whether errno is set.


-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

  reply	other threads:[~2018-02-05 19:37 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-05 15:24 [Qemu-devel] [PATCH v4 0/9] Enable passing pre-opened chardev socket FD Daniel P. Berrangé
2018-02-05 15:24 ` [Qemu-devel] [PATCH v4 1/9] char: don't silently skip tn3270 protocol init when TLS is enabled Daniel P. Berrangé
2018-02-05 16:10   ` Cornelia Huck
2018-02-05 15:24 ` [Qemu-devel] [PATCH v4 2/9] cutils: add qemu_strtoi & qemu_strtoui parsers for int/unsigned int types Daniel P. Berrangé
2018-02-05 19:37   ` Eric Blake [this message]
2018-02-07 16:29     ` Daniel P. Berrangé
2018-02-05 15:24 ` [Qemu-devel] [PATCH v4 3/9] sockets: pull code for testing IP availability out of specific test Daniel P. Berrangé
2018-02-05 15:24 ` [Qemu-devel] [PATCH v4 4/9] sockets: strengthen test suite IP protocol availability checks Daniel P. Berrangé
2018-02-05 15:24 ` [Qemu-devel] [PATCH v4 5/9] sockets: move fd_is_socket() into common sockets code Daniel P. Berrangé
2018-02-05 16:13   ` Marc-Andre Lureau
2018-02-05 15:24 ` [Qemu-devel] [PATCH v4 6/9] sockets: check that the named file descriptor is a socket Daniel P. Berrangé
2018-02-05 15:24 ` [Qemu-devel] [PATCH v4 7/9] sockets: allow SocketAddress 'fd' to reference numeric file descriptors Daniel P. Berrangé
2018-02-05 19:42   ` Eric Blake
2018-02-06  9:13     ` Daniel P. Berrangé
2018-02-06 14:48       ` Eric Blake
2018-03-12 12:44         ` Daniel P. Berrangé
2018-02-05 15:24 ` [Qemu-devel] [PATCH v4 8/9] char: refactor parsing of socket address information Daniel P. Berrangé
2018-02-05 15:24 ` [Qemu-devel] [PATCH v4 9/9] char: allow passing pre-opened socket file descriptor at startup Daniel P. Berrangé
2018-02-05 17:33 ` [Qemu-devel] [PATCH v4 0/9] Enable passing pre-opened chardev socket FD no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8ab20df7-a6fe-7dca-d6c3-f3ab33f78550@redhat.com \
    --to=eblake@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).