From f46bfdbfc8f95cf65d7818ef68a801e063c40332 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Tue, 21 Feb 2017 21:14:07 +0100 Subject: 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 Cc: Eduardo Habkost (maintainer:X86) Cc: Kevin Wolf (supporter:Block layer core) Cc: Max Reitz (supporter:Block layer core) Cc: qemu-block@nongnu.org (open list:Block layer core) Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Dr. David Alan Gilbert Message-Id: <1487708048-2131-24-git-send-email-armbru@redhat.com> --- util/cutils.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'util/cutils.c') 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); } -- cgit v1.2.3-55-g7522