On 03/22/2012 06:51 AM, Paolo Bonzini wrote:
Objects going through the dealloc visitor can be only partially allocated.
Detect the situation and avoid a segfault.  This also helps with the
input visitor, when there are errors.

Signed-off-by: Paolo Bonzini<pbonz...@redhat.com>

Reviewed-by: Anthony Liguori <aligu...@us.ibm.com>

Regards,

Anthony Liguori

---
  scripts/qapi-visit.py |    7 +++++++
  1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index b242315..a85fb76 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -65,6 +65,9 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const 
char *name, Error **
          return;
      }
      visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), 
errp);
+    if (obj&&  !*obj) {
+        goto end;
+    }
  ''',
                  name=name)
      push_indent()
@@ -72,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);
  }
  ''')
@@ -122,6 +126,9 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const 
char *name, Error **
          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);


Reply via email to