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

qapi: Assert non-input visitors see only valid narrow integers



visit_type_intN() and visit_type_uintN() fail when the value is out of
bounds.

This is appropriate with an input visitor: the value comes from input,
and input may be bad.

It should never happen with the other visitors: the value comes from
the caller, and callers must keep it within bounds.  Assert that.

Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Message-Id: <20200424084338.26803-10-armbru@redhat.com>
parent 777d20cf
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -160,10 +160,13 @@ static void visit_type_uintN(Visitor *v, uint64_t *obj, const char *name,
    Error *err = NULL;
    uint64_t value = *obj;

    assert(v->type == VISITOR_INPUT || value <= max);

    v->type_uint64(v, name, &value, &err);
    if (err) {
        error_propagate(errp, err);
    } else if (value > max) {
        assert(v->type == VISITOR_INPUT);
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                   name ? name : "null", type);
    } else {
@@ -219,10 +222,13 @@ static void visit_type_intN(Visitor *v, int64_t *obj, const char *name,
    Error *err = NULL;
    int64_t value = *obj;

    assert(v->type == VISITOR_INPUT || (value >= min && value <= max));

    v->type_int64(v, name, &value, &err);
    if (err) {
        error_propagate(errp, err);
    } else if (value < min || value > max) {
        assert(v->type == VISITOR_INPUT);
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                   name ? name : "null", type);
    } else {