From: Rico Tzschichholz Date: Wed, 22 Jul 2020 08:16:39 +0000 (+0200) Subject: codegen: Check param for null before using it X-Git-Tag: 0.40.24~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64ab2bf83c29982a0bc716aa1297373140744c12;p=thirdparty%2Fvala.git codegen: Check param for null before using it Regression of 5490b0b21a4089d803d51c91311430d60d266f7b This caused criticals like: vala_get_ccode_array_length: assertion 'node != NULL' failed See https://gitlab.gnome.org/GNOME/vala/issues/929 --- diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 317091d9c..33357527b 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -878,7 +878,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule { // update possible stale _*_size_ variable if (unary != null && unary.operator == UnaryOperator.REF) { - if (get_ccode_array_length (param) && param.variable_type is ArrayType + if (param != null && get_ccode_array_length (param) && param.variable_type is ArrayType && !((ArrayType) param.variable_type).fixed_length && ((ArrayType) param.variable_type).rank == 1) { unowned Symbol? array_var = unary.inner.symbol_reference; unowned LocalVariable? array_local = array_var as LocalVariable; diff --git a/tests/Makefile.am b/tests/Makefile.am index 85d6a858d..18a8ccfde 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -178,6 +178,7 @@ TESTS = \ methods/varargs-delegate-without-target.vala \ methods/varargs-gvalue.vala \ methods/varargs-out.vala \ + methods/varargs-ref.vala \ methods/varargs-struct.vala \ control-flow/assigned-local-variable.vala \ control-flow/break.vala \ diff --git a/tests/methods/varargs-ref.vala b/tests/methods/varargs-ref.vala new file mode 100644 index 000000000..9c3f5fa74 --- /dev/null +++ b/tests/methods/varargs-ref.vala @@ -0,0 +1,14 @@ +void set_foo_varg (string s, ...) { + var args = va_list (); + string** ref_s1 = args.arg (); + *ref_s1 = "bar"; + string** ref_s2 = args.arg (); + *ref_s2 = "manam"; +} + +void main () { + unowned string bar = "", manam = ""; + set_foo_varg ("foo", ref bar, ref manam); + assert (bar == "bar"); + assert (manam == "manam"); +}