Fix memory leak in _sizeof implemented with _unserialize
[free-sw/xcb/libxcb] / src / c_client.py
index 26826e4..08d6ec4 100644 (file)
@@ -399,8 +399,9 @@ def _c_type_setup(self, name, postfix):
                     
         if self.need_sizeof:
             if self.c_sizeof_name not in finished_sizeof:
-                finished_sizeof.append(self.c_sizeof_name)
-                _c_serialize('sizeof', self)
+                if not module.namespace.is_ext or self.name[:2] == module.namespace.prefix:
+                    finished_sizeof.append(self.c_sizeof_name)
+                    _c_serialize('sizeof', self)
 # _c_type_setup()
 
 def _c_helper_absolute_name(prefix, field=None):
@@ -1133,8 +1134,7 @@ def _c_serialize(context, self):
             return
         elif self.var_followed_by_fixed_fields:
             # special case: call _unserialize()
-            _c('    %s *_aux = NULL;', self.c_type)
-            _c('    return %s(%s, &_aux);', self.c_unserialize_name, reduce(lambda x,y: "%s, %s" % (x, y), param_names))
+            _c('    return %s(%s, NULL);', self.c_unserialize_name, reduce(lambda x,y: "%s, %s" % (x, y), param_names))
             _c('}')
             return
         else:
@@ -1179,6 +1179,12 @@ def _c_serialize(context, self):
     # allocate memory and copy everything into a continuous memory area 
     # note: this is not necessary in case of unpack
     if context in ('serialize', 'unserialize'):
+        # unserialize: check for sizeof-only invocation
+        if 'unserialize' == context:
+            _c('')
+            _c('    if (NULL == _aux)')
+            _c('        return xcb_buffer_len;')
+
         _c('')
         _c('    if (NULL == %s) {', aux_ptr)
         _c('        /* allocate memory */')