From: Jürg Billeter Date: Sun, 31 May 2009 20:14:32 +0000 (+0200) Subject: D-Bus: Fix memory leaks in servers X-Git-Tag: 0.7.4~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d2e7678f699f0c2f13f31104d201406353688a75;p=thirdparty%2Fvala.git D-Bus: Fix memory leaks in servers Free allocated memory used for parameters and return values in D-Bus servers. Based on patch by Sebastian Pölsterl, fixes bug 566207. --- diff --git a/codegen/valadbusservermodule.vala b/codegen/valadbusservermodule.vala index e02b7edde..1ffcbda47 100644 --- a/codegen/valadbusservermodule.vala +++ b/codegen/valadbusservermodule.vala @@ -111,7 +111,10 @@ internal class Vala.DBusServerModule : DBusClientModule { string type_signature = ""; foreach (FormalParameter param in m.get_parameters ()) { - cdecl = new CCodeDeclaration (param.parameter_type.get_cname ()); + var owned_type = param.parameter_type.copy (); + owned_type.value_owned = true; + + cdecl = new CCodeDeclaration (owned_type.get_cname ()); cdecl.add_declarator (new CCodeVariableDeclarator (param.name, default_value_for_type (param.parameter_type, true))); prefragment.append (cdecl); if (type_signature == "" @@ -165,6 +168,12 @@ internal class Vala.DBusServerModule : DBusClientModule { } else { write_expression (postfragment, param.parameter_type, new CCodeIdentifier ("iter"), new CCodeIdentifier (param.name)); } + + if (requires_destroy (owned_type)) { + var ma = new MemberAccess.simple (param.name); + ma.symbol_reference = param; + postfragment.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (param.name), owned_type, ma))); + } } signature_check.add_argument (new CCodeConstant ("\"%s\"".printf (type_signature))); @@ -192,6 +201,12 @@ internal class Vala.DBusServerModule : DBusClientModule { } write_expression (postfragment, m.return_type, new CCodeIdentifier ("iter"), new CCodeIdentifier ("result")); + + if (requires_destroy (m.return_type)) { + var ma = new MemberAccess.simple ("result"); + ma.symbol_reference = new LocalVariable (m.return_type, "result"); + postfragment.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier ("result"), m.return_type, ma))); + } } } else { block.add_statement (new CCodeExpressionStatement (ccall));