[vala/staging] vala: Check assigned handler of dynamic signal before proceeding further



commit 59bf720da38793b99ddf18c45b26c192840f29aa
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Wed Apr 15 21:17:33 2020 +0200

    vala: Check assigned handler of dynamic signal before proceeding further
    
    This fixes criticals if an errornous expression was given.

 tests/Makefile.am                                  | 1 +
 tests/objects/signals-dymanic-invalid-handler.test | 6 ++++++
 vala/valamemberaccess.vala                         | 5 +++++
 3 files changed, 12 insertions(+)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 09f91d3b4..752e9b8fb 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 000000000..ce1e86cf1
--- /dev/null
+++ b/tests/objects/signals-dymanic-invalid-handler.test
@@ -0,0 +1,6 @@
+Invalid Code
+
+void main () {
+       dynamic Object? foo = null;
+       foo.on_bar.connect (non_existent);
+}
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index b8d5d1252..2c0355e1d 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -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);


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