qapi: Assert non-input visitors see only valid alternate tags
authorMarkus Armbruster <armbru@redhat.com>
Fri, 24 Apr 2020 08:43:34 +0000 (10:43 +0200)
committerMarkus Armbruster <armbru@redhat.com>
Thu, 30 Apr 2020 05:26:40 +0000 (07:26 +0200)
An alternate type's visit_type_FOO() fails when it runs into an
invalid ->type.

This is appropriate with an input visitor: visit_start_alternate()
sets ->type according to the input, and bad input can lead to bad
->type.

It should never happen with an output, clone or dealloc visitor: if it
did, the alternate being output, cloned or deallocated would be messed
up beyond repair.  Assert that.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20200424084338.26803-12-armbru@redhat.com>

scripts/qapi/visit.py

index 678109dfb556701cdaeaef17a743d4ef985e8aff..d5d7a1031f3f03bc6561e066ef7f29f53075683a 100644 (file)
@@ -232,6 +232,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
     case QTYPE_NONE:
         abort();
     default:
+        assert(visit_is_input(v));
         error_setg(&err, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                    "%(name)s");
         /* Avoid passing invalid *obj to qapi_free_%(c_name)s() */