]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix leak when destroying null terminated arrays
authorLuca Bruno <lucabru@src.gnome.org>
Wed, 16 Mar 2011 13:27:07 +0000 (14:27 +0100)
committerJürg Billeter <j@bitron.ch>
Sun, 27 Mar 2011 14:24:47 +0000 (16:24 +0200)
codegen/valaccodebasemodule.vala

index b23a08d24994bf4383687bdcdfedb4896d4c33ba..4ac24db465b76e2b8d2f9ded70b1cf5dc886e20c 100644 (file)
@@ -2906,7 +2906,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                ccall.add_argument (new CCodeConstant ("TRUE"));
                        } else if (type is ArrayType) {
                                var array_type = (ArrayType) type;
-                               if (requires_destroy (array_type.element_type) && !variable.no_array_length) {
+                               if (requires_destroy (array_type.element_type)) {
                                        CCodeExpression csizeexpr = null;
                                        if (variable.array_null_terminated) {
                                                var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
@@ -2914,7 +2914,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                csizeexpr = len_call;
                                        } else if (variable.has_array_length_cexpr) {
                                                csizeexpr = new CCodeConstant (variable.get_array_length_cexpr ());
-                                       } else {
+                                       } else if (!variable.no_array_length) {
                                                bool first = true;
                                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                                        if (first) {
@@ -2926,15 +2926,17 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                }
                                        }
 
-                                       var st = array_type.element_type.data_type as Struct;
-                                       if (st != null && !array_type.element_type.nullable) {
-                                               ccall.call = new CCodeIdentifier (append_struct_array_free (st));
-                                               ccall.add_argument (csizeexpr);
-                                       } else {
-                                               requires_array_free = true;
-                                               ccall.call = new CCodeIdentifier ("_vala_array_free");
-                                               ccall.add_argument (csizeexpr);
-                                               ccall.add_argument (new CCodeCastExpression (get_destroy_func_expression (array_type.element_type), "GDestroyNotify"));
+                                       if (csizeexpr != null) {
+                                               var st = array_type.element_type.data_type as Struct;
+                                               if (st != null && !array_type.element_type.nullable) {
+                                                       ccall.call = new CCodeIdentifier (append_struct_array_free (st));
+                                                       ccall.add_argument (csizeexpr);
+                                               } else {
+                                                       requires_array_free = true;
+                                                       ccall.call = new CCodeIdentifier ("_vala_array_free");
+                                                       ccall.add_argument (csizeexpr);
+                                                       ccall.add_argument (new CCodeCastExpression (get_destroy_func_expression (array_type.element_type), "GDestroyNotify"));
+                                               }
                                        }
                                }
                        }