From 59bf720da38793b99ddf18c45b26c192840f29aa Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Wed, 15 Apr 2020 21:17:33 +0200 Subject: [PATCH] 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(+) create mode 100644 tests/objects/signals-dymanic-invalid-handler.test 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); -- 2.47.3