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 | |
parent | 0a5a4e0568d4cc981457a2d1e7f86923eeff94ed (diff) | |
parent | 1829851cfee10e196abec50325d828de182fd356 (diff) | |
download | qemu-c76d1a9b3f367754966c326d81ff8566798b473a.zip qemu-c76d1a9b3f367754966c326d81ff8566798b473a.tar.gz qemu-c76d1a9b3f367754966c326d81ff8566798b473a.tar.bz2 |
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')
-rw-r--r-- | scripts/qapi-commands.py | 2 | ||||
-rw-r--r-- | scripts/qapi-visit.py | 20 |
2 files changed, 19 insertions, 3 deletions
diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 30a24d2..0b4f0a0 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -140,7 +140,7 @@ v = qapi_dealloc_get_visitor(md); ''') else: ret += mcgen(''' -mi = qmp_input_visitor_new(%(obj)s); +mi = qmp_input_visitor_new_strict(%(obj)s); v = qmp_input_get_visitor(mi); ''', obj=obj) diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index 78c947c..8d4e94a 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); |