[13/28] qapi: fix potential segfault for visit_type_size()

Message ID 1351722972-17801-14-git-send-email-mdroth@linux.vnet.ibm.com
State New
Headers show

Commit Message

Michael Roth Oct. 31, 2012, 10:35 p.m.
visit_type_size() was added for use-cases currently only encountered by
OptsVisitor users, which implements a specific handler for
visit_type_size(). For Visitor implementations that don't implement the
handler, we fallback to using v->type_uint64().

However, some visitor implementations, such as Qmp*Visitor, also rely on
fallback code to handle visit_type_uint64() calls, and leave v->type_uint64
unset. This leads to a segfault when we try to use visit_type_size().

Fix this by calling the visit_type_uint64() function in visit_type_size()'s
fallback instead of calling v->type_uint64() directly.

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
 qapi/qapi-visit-core.c |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)


diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
index 9a74ed0..dd28cb9 100644
--- a/qapi/qapi-visit-core.c
+++ b/qapi/qapi-visit-core.c
@@ -237,7 +237,11 @@  void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp)
 void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp)
     if (!error_is_set(errp)) {
-        (v->type_size ? v->type_size : v->type_uint64)(v, obj, name, errp);
+        if (v->type_size) {
+            v->type_size(v, obj, name, errp);
+        } else {
+            visit_type_uint64(v, obj, name, errp);
+        }