On 11/15/18 8:04 AM, David Hildenbrand wrote:
Let's use the new function. In order to do so, we have to convert all
users of qemu_strtosz*() to pass a "const char **end" ptr.

We will now also reject "inf" properly.

Signed-off-by: David Hildenbrand <[email protected]>
---
  include/qemu/cutils.h |  6 +++---
  monitor.c             |  2 +-
  tests/test-cutils.c   | 14 +++++++-------
  util/cutils.c         | 14 ++++++--------
  4 files changed, 17 insertions(+), 19 deletions(-)


+++ b/tests/test-cutils.c
@@ -1950,7 +1950,7 @@ static void test_qemu_strtou64_full_max(void)
  static void test_qemu_strtosz_simple(void)
  {
      const char *str;
-    char *endptr = NULL;
+    const char *endptr = NULL;
...
diff --git a/util/cutils.c b/util/cutils.c

Conversion of call sites is good (in fact, you could drop the ' = NULL' initialization, since do_strtosz() guarantees it is set to something sane even on error). But where's the added test coverage of rejecting "inf" as a size?

index 7868a683e8..dd61fb4558 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -206,19 +206,17 @@ static int64_t suffix_mul(char suffix, int64_t unit)
   * in *end, if not NULL. Return -ERANGE on overflow, Return -EINVAL on
   * other error.
   */
-static int do_strtosz(const char *nptr, char **end,
+static int do_strtosz(const char *nptr, const char **end,
                        const char default_suffix, int64_t unit,
                        uint64_t *result)
  {
      int retval;
-    char *endptr;
+    const char *endptr;
      unsigned char c;
      int mul_required = 0;
      double val, mul, integral, fraction;
- errno = 0;
-    val = strtod(nptr, &endptr);
-    if (isnan(val) || endptr == nptr || errno != 0) {
+    if (qemu_strtod_finite(nptr, &endptr, &val)) {
          retval = -EINVAL;

This slams -ERANGE failure into -EINVAL. Do we care? Or would it have been better to just do:

retval = qemu_strtod_finite(...);
if (retval) {
    goto out;

          goto out;
      }
@@ -259,17 +257,17 @@ out:

More context:

out:
    if (end) {
        *end = endptr;
    } else if (*endptr) {
        retval = -EINVAL;
    }

      return retval;
  }

Everything else looks okay.

Hmm - while touching this, is it worth making mul_required be a bool, to match its use?

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

Reply via email to