Commit f17fd4fd authored by Markus Armbruster's avatar Markus Armbruster
Browse files

util/cutils: Return qemu_strtosz*() error and value separately



This makes qemu_strtosz(), qemu_strtosz_mebi() and
qemu_strtosz_metric() similar to qemu_strtoi64(), except negative
values are rejected.

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: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Reviewed-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <1487708048-2131-23-git-send-email-armbru@redhat.com>
parent 4fcdf65a
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1348,7 +1348,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
    long valueint = 0;
    Error *err = NULL;
    bool use_int_value = false;
    int i;
    int i, ret;

    for (i = 0; i < MIGRATION_PARAMETER__MAX; i++) {
        if (strcmp(param, MigrationParameter_lookup[i]) == 0) {
@@ -1384,8 +1384,8 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
                break;
            case MIGRATION_PARAMETER_MAX_BANDWIDTH:
                p.has_max_bandwidth = true;
                valuebw = qemu_strtosz_MiB(valuestr, NULL);
                if (valuebw < 0 || (size_t)valuebw != valuebw) {
                ret = qemu_strtosz_MiB(valuestr, NULL, &valuebw);
                if (ret < 0 || (size_t)valuebw != valuebw) {
                    error_setg(&err, "Invalid size %s", valuestr);
                    goto cleanup;
                }
+5 −2
Original line number Diff line number Diff line
@@ -1267,8 +1267,11 @@ static void ivshmem_realize(PCIDevice *dev, Error **errp)
    if (s->sizearg == NULL) {
        s->legacy_size = 4 << 20; /* 4 MB default */
    } else {
        int64_t size = qemu_strtosz_MiB(s->sizearg, NULL);
        if (size < 0 || (size_t)size != size || !is_power_of_2(size)) {
        int ret;
        int64_t size;

        ret = qemu_strtosz_MiB(s->sizearg, NULL, &size);
        if (ret < 0 || (size_t)size != size || !is_power_of_2(size)) {
            error_setg(errp, "Invalid size %s", s->sizearg);
            return;
        }
+3 −3
Original line number Diff line number Diff line
@@ -139,9 +139,9 @@ int parse_uint(const char *s, unsigned long long *value, char **endptr,
               int base);
int parse_uint_full(const char *s, unsigned long long *value, int base);

int64_t qemu_strtosz(const char *nptr, char **end);
int64_t qemu_strtosz_MiB(const char *nptr, char **end);
int64_t qemu_strtosz_metric(const char *nptr, char **end);
int qemu_strtosz(const char *nptr, char **end, int64_t *result);
int qemu_strtosz_MiB(const char *nptr, char **end, int64_t *result);
int qemu_strtosz_metric(const char *nptr, char **end, int64_t *result);

#define K_BYTE     (1ULL << 10)
#define M_BYTE     (1ULL << 20)
+3 −2
Original line number Diff line number Diff line
@@ -2799,6 +2799,7 @@ static QDict *monitor_parse_arguments(Monitor *mon,
            break;
        case 'o':
            {
                int ret;
                int64_t val;
                char *end;

@@ -2811,8 +2812,8 @@ static QDict *monitor_parse_arguments(Monitor *mon,
                        break;
                    }
                }
                val = qemu_strtosz_MiB(p, &end);
                if (val < 0) {
                ret = qemu_strtosz_MiB(p, &end, &val);
                if (ret < 0) {
                    monitor_printf(mon, "invalid size\n");
                    goto fail;
                }
+3 −2
Original line number Diff line number Diff line
@@ -482,14 +482,15 @@ opts_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp)
    OptsVisitor *ov = to_ov(v);
    const QemuOpt *opt;
    int64_t val;
    int err;

    opt = lookup_scalar(ov, name, errp);
    if (!opt) {
        return;
    }

    val = qemu_strtosz(opt->str ? opt->str : "", NULL);
    if (val < 0) {
    err = qemu_strtosz(opt->str ? opt->str : "", NULL, &val);
    if (err < 0) {
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name,
                   "a size value representible as a non-negative int64");
        return;
Loading