diff options
author | Markus Armbruster <armbru@redhat.com> | 2017-02-21 21:14:07 +0100 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2017-02-23 20:35:36 +0100 |
commit | f46bfdbfc8f95cf65d7818ef68a801e063c40332 (patch) | |
tree | 3f4d22f4a161acadbfe44219f6a493145c49502a /util/cutils.c | |
parent | f17fd4fdf0df3d2f3444399d04c38d22b9a3e1b7 (diff) |
util/cutils: Change qemu_strtosz*() from int64_t to uint64_t
This will permit its use in parse_option_size().
Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com> (maintainer:X86)
Cc: Kevin Wolf <kwolf@redhat.com> (supporter:Block layer core)
Cc: Max Reitz <mreitz@redhat.com> (supporter:Block layer core)
Cc: qemu-block@nongnu.org (open list:Block layer core)
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <1487708048-2131-24-git-send-email-armbru@redhat.com>
Diffstat (limited to 'util/cutils.c')
-rw-r--r-- | util/cutils.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/util/cutils.c b/util/cutils.c index 7088ddcb09..50ad179dc5 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -207,7 +207,7 @@ static int64_t suffix_mul(char suffix, int64_t unit) */ static int do_strtosz(const char *nptr, char **end, const char default_suffix, int64_t unit, - int64_t *result) + uint64_t *result) { int retval; char *endptr; @@ -237,7 +237,11 @@ static int do_strtosz(const char *nptr, char **end, retval = -EINVAL; goto out; } - if ((val * mul >= INT64_MAX) || val < 0) { + /* + * Values >= 0xfffffffffffffc00 overflow uint64_t after their trip + * through double (53 bits of precision). + */ + if ((val * mul >= 0xfffffffffffffc00) || val < 0) { retval = -ERANGE; goto out; } @@ -254,17 +258,17 @@ out: return retval; } -int qemu_strtosz(const char *nptr, char **end, int64_t *result) +int qemu_strtosz(const char *nptr, char **end, uint64_t *result) { return do_strtosz(nptr, end, 'B', 1024, result); } -int qemu_strtosz_MiB(const char *nptr, char **end, int64_t *result) +int qemu_strtosz_MiB(const char *nptr, char **end, uint64_t *result) { return do_strtosz(nptr, end, 'M', 1024, result); } -int qemu_strtosz_metric(const char *nptr, char **end, int64_t *result) +int qemu_strtosz_metric(const char *nptr, char **end, uint64_t *result) { return do_strtosz(nptr, end, 'B', 1000, result); } |