diff options
-rw-r--r-- | scripts/qapi-visit.py | 4 | ||||
-rw-r--r-- | tests/test-qmp-input-visitor.c | 10 |
2 files changed, 13 insertions, 1 deletions
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index f40c3c792f..3ef5c16a66 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -138,6 +138,10 @@ void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error def gen_visit_list(name, element_type): + # FIXME: if *obj is NULL on entry, and the first visit_next_list() + # assigns to *obj, while a later one fails, we should clean up *obj + # rather than leaving it non-NULL. As currently written, the caller must + # call qapi_free_FOOList() to avoid a memory leak of the partial FOOList. return mcgen(''' void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error **errp) diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c index ef5284daa2..aa02eec765 100644 --- a/tests/test-qmp-input-visitor.c +++ b/tests/test-qmp-input-visitor.c @@ -698,8 +698,10 @@ static void test_visitor_in_errors(TestInputVisitorData *data, TestStruct *p = NULL; Error *err = NULL; Visitor *v; + strList *q = NULL; - v = visitor_input_test_init(data, "{ 'integer': false, 'boolean': 'foo', 'string': -42 }"); + v = visitor_input_test_init(data, "{ 'integer': false, 'boolean': 'foo', " + "'string': -42 }"); visit_type_TestStruct(v, &p, NULL, &err); error_free_or_abort(&err); @@ -709,6 +711,12 @@ static void test_visitor_in_errors(TestInputVisitorData *data, g_free(p->string); g_free(p); + + v = visitor_input_test_init(data, "[ '1', '2', false, '3' ]"); + visit_type_strList(v, &q, NULL, &err); + error_free_or_abort(&err); + assert(q); + qapi_free_strList(q); } int main(int argc, char **argv) |