]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Capturing va_list parameters/variables is not allowed
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 16 Feb 2021 09:33:06 +0000 (10:33 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 27 Feb 2021 19:26:43 +0000 (20:26 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1136

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/semantic/member-access-capture-valist-parameter.test [new file with mode: 0644]
tests/semantic/member-access-capture-valist-variable.test [new file with mode: 0644]
vala/valamemberaccess.vala

index c434ac1be0e1e54d0fbf419243e9ec4b6d86b9cd..157136c5804b7d0c7bfe4f66611a1420ba2c7cde 100644 (file)
@@ -2150,6 +2150,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                if (local.variable_type.is_disposable ()) {
                                                        data.add_field (get_ccode_name (delegate_target_destroy_type), get_delegate_target_destroy_notify_cname (get_local_cname (local)));
                                                }
+                                       } else if (local.variable_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
+                                               Report.error (local.source_reference, "internal: Capturing `va_list' variable `%s' is not allowed".printf (local.get_full_name ()));
+                                               b.error = true;
                                        }
                                }
                        }
@@ -2209,6 +2212,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                foreach (var param in m.get_parameters ()) {
                                        if (param.captured) {
                                                capture_parameter (param, data, block_id);
+
+                                               if (param.variable_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
+                                                       Report.error (param.source_reference, "internal: Capturing `va_list' parameter `%s' is not allowed".printf (param.get_full_name ()));
+                                                       b.error = true;
+                                               }
                                        }
                                }
 
index fccba9159d6c3879fee1c9108afb143eeeed6e7e..797db328c474db239fc295accf01be04915c6955 100644 (file)
@@ -955,6 +955,8 @@ TESTS = \
        semantic/localvariable-void-initializer.test \
        semantic/member-access-async-callback-invalid.test \
        semantic/member-access-capture-out.test \
+       semantic/member-access-capture-valist-parameter.test \
+       semantic/member-access-capture-valist-variable.test \
        semantic/member-access-protected-invalid.test \
        semantic/member-access-undefined.test \
        semantic/member-access-static-with-instance.vala \
diff --git a/tests/semantic/member-access-capture-valist-parameter.test b/tests/semantic/member-access-capture-valist-parameter.test
new file mode 100644 (file)
index 0000000..6682b25
--- /dev/null
@@ -0,0 +1,12 @@
+Invalid Code
+
+delegate void FooFunc ();
+
+void foo (int first, va_list v) {
+       FooFunc f = () => {
+               int arg = v.arg<int> ();
+       };
+}
+
+void main () {
+}
diff --git a/tests/semantic/member-access-capture-valist-variable.test b/tests/semantic/member-access-capture-valist-variable.test
new file mode 100644 (file)
index 0000000..fff299b
--- /dev/null
@@ -0,0 +1,13 @@
+Invalid Code
+
+delegate void FooFunc ();
+
+void foo (int first, ...) {
+       va_list v = va_list ();
+       FooFunc f = () => {
+               int arg = v.arg<int> ();
+       };
+}
+
+void main () {
+}
index b1cc20ada6533f101918adc6c3314026208e8964..5d10e3009a9d1dacf1a0a66c250aacc18a0e6039 100644 (file)
@@ -617,6 +617,11 @@ public class Vala.MemberAccess : Expression {
 
                                local.captured = true;
                                block.captured = true;
+
+                               if (local.variable_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
+                                       error = true;
+                                       Report.error (source_reference, "Capturing `va_list' variable `%s' is not allowed".printf (local.get_full_name ()));
+                               }
                        }
                } else if (member is Parameter) {
                        unowned Parameter param = (Parameter) member;
@@ -640,6 +645,10 @@ public class Vala.MemberAccess : Expression {
                                        error = true;
                                        Report.error (source_reference, "Cannot capture reference or output parameter `%s'".printf (param.get_full_name ()));
                                }
+                               if (param.variable_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
+                                       error = true;
+                                       Report.error (source_reference, "Capturing `va_list' parameter `%s' is not allowed".printf (param.get_full_name ()));
+                               }
                        } else {
                                unowned PropertyAccessor? acc = param.parent_symbol.parent_symbol as PropertyAccessor;
                                if (acc != null && acc != context.analyzer.current_method_or_property_accessor && param != acc.prop.this_parameter) {