diff options
| author | Anthony Liguori <aliguori@us.ibm.com> | 2012-03-28 12:45:22 -0500 |
|---|---|---|
| committer | Anthony Liguori <aliguori@us.ibm.com> | 2012-03-28 12:45:22 -0500 |
| commit | c76d1a9b3f367754966c326d81ff8566798b473a (patch) | |
| tree | 2ac34dddcb214c3a7de2834f8f69e8211f697a5e /scripts/qapi-visit.py | |
| parent | 0a5a4e0568d4cc981457a2d1e7f86923eeff94ed (diff) | |
| parent | 1829851cfee10e196abec50325d828de182fd356 (diff) | |
| download | focaccia-qemu-c76d1a9b3f367754966c326d81ff8566798b473a.tar.gz focaccia-qemu-c76d1a9b3f367754966c326d81ff8566798b473a.zip | |
Merge remote-tracking branch 'qmp/queue/qmp' into staging
* qmp/queue/qmp: qmp: document strict parsing qmp: parse commands in strict mode qmp: add and use q type specifier qapi: add strict mode to input visitor qapi: place outermost object on qiv stack qapi: untangle next_list qapi: allow freeing partially-allocated objects qapi: shortcut visits on errors qapi: fix memory leak on error qapi: fail hard on stack imbalance qapi: add a test case for type errors qapi: add struct-errors test case to test-qmp-output-visitor qapi: fix double free in qmp_output_visitor_cleanup()
Diffstat (limited to 'scripts/qapi-visit.py')
| -rw-r--r-- | scripts/qapi-visit.py | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index 78c947cd9c..8d4e94a45f 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -61,7 +61,13 @@ def generate_visit_struct(name, members): void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error **errp) { + if (error_is_set(errp)) { + return; + } visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), errp); + if (obj && !*obj) { + goto end; + } ''', name=name) push_indent() @@ -69,6 +75,7 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error ** pop_indent() ret += mcgen(''' +end: visit_end_struct(m, errp); } ''') @@ -79,11 +86,14 @@ def generate_visit_list(name, members): void visit_type_%(name)sList(Visitor *m, %(name)sList ** obj, const char *name, Error **errp) { - GenericList *i, **head = (GenericList **)obj; + GenericList *i, **prev = (GenericList **)obj; + if (error_is_set(errp)) { + return; + } visit_start_list(m, name, errp); - for (*head = i = visit_next_list(m, head, errp); i; i = visit_next_list(m, &i, errp)) { + for (; (i = visit_next_list(m, prev, errp)) != NULL; prev = &i) { %(name)sList *native_i = (%(name)sList *)i; visit_type_%(name)s(m, &native_i->value, NULL, errp); } @@ -112,7 +122,13 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error ** { Error *err = NULL; + if (error_is_set(errp)) { + return; + } visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err); + if (obj && !*obj) { + goto end; + } visit_type_%(name)sKind(m, &(*obj)->kind, "type", &err); if (err) { error_propagate(errp, err); |