[vala] D-Bus: Fix memory leaks in servers



commit d2e7678f699f0c2f13f31104d201406353688a75
Author: Jürg Billeter <j bitron ch>
Date:   Sun May 31 22:14:32 2009 +0200

    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.
---
 codegen/valadbusservermodule.vala |   17 ++++++++++++++++-
 1 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/codegen/valadbusservermodule.vala b/codegen/valadbusservermodule.vala
index e02b7ed..1ffcbda 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));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]