]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Check assigned handler of dynamic signal before proceeding further
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 15 Apr 2020 19:17:33 +0000 (21:17 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 15 Apr 2020 19:17:33 +0000 (21:17 +0200)
This fixes criticals if an errornous expression was given.

tests/Makefile.am
tests/objects/signals-dymanic-invalid-handler.test [new file with mode: 0644]
vala/valamemberaccess.vala

index 09f91d3b41337a38da63b576f20094fc5617c332..752e9b8fb889fa3dca5de0664c59ff27c5882dae 100644 (file)
@@ -416,6 +416,7 @@ TESTS = \
        objects/signals-enum-marshal.vala \
        objects/signals-delegate.vala \
        objects/signals-delegate-parameter.vala \
+       objects/signals-dymanic-invalid-handler.test \
        objects/signals-fundamental-return.vala \
        objects/signals-gobject-return.vala \
        objects/signals-lambda-delegate.vala \
diff --git a/tests/objects/signals-dymanic-invalid-handler.test b/tests/objects/signals-dymanic-invalid-handler.test
new file mode 100644 (file)
index 0000000..ce1e86c
--- /dev/null
@@ -0,0 +1,6 @@
+Invalid Code
+
+void main () {
+       dynamic Object? foo = null;
+       foo.on_bar.connect (non_existent);
+}
index b8d5d12524c2607440d7470410e5b5168f85b8a4..2c0355e1d4d95ecafb25a889dd8d29c7b6c19f26 100644 (file)
@@ -436,6 +436,11 @@ public class Vala.MemberAccess : Expression {
                                                // the first argument is the handler
                                                if (mcall.get_argument_list().size > 0) {
                                                        s.handler = mcall.get_argument_list()[0];
+                                                       unowned MemberAccess? arg = s.handler as MemberAccess;
+                                                       if (arg == null || !arg.check (context) || !(arg.symbol_reference is Method)) {
+                                                               error = true;
+                                                               Report.error (s.handler.source_reference, "Invalid handler for `%s'".printf (s.get_full_name ()));
+                                                       }
                                                }
                                                s.access = SymbolAccessibility.PUBLIC;
                                                dynamic_object_type.type_symbol.scope.add (null, s);