]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: value_type of PointerIndirection expressions must not be owned
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 21 Dec 2020 12:52:54 +0000 (13:52 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 21 Dec 2020 12:52:54 +0000 (13:52 +0100)
A member-access making the wrong assumption of a previous copy resulted
in a double free.

Fixes https://gitlab.gnome.org/GNOME/vala/issues/1118

tests/Makefile.am
tests/semantic/localvariable-var-pointer-initializer.vala [new file with mode: 0644]
vala/valapointerindirection.vala

index b620a847f6f83b1324af61e9be090940c749ba0f..ddac2068446f0d12dea0d25cc9afa5b22dd22d39 100644 (file)
@@ -914,6 +914,7 @@ TESTS = \
        semantic/interface-prerequisite-multiple.test \
        semantic/literal-expression.test \
        semantic/localvariable-owned-to-unowned.test \
+       semantic/localvariable-var-pointer-initializer.vala \
        semantic/localvariable-var-static-access-instance-field.test \
        semantic/localvariable-var-static-access-instance-method.test \
        semantic/localvariable-var-static-access-instance-property.test \
diff --git a/tests/semantic/localvariable-var-pointer-initializer.vala b/tests/semantic/localvariable-var-pointer-initializer.vala
new file mode 100644 (file)
index 0000000..42bafc9
--- /dev/null
@@ -0,0 +1,16 @@
+struct Foo {
+       public string s;
+}
+
+void main () {
+       {
+               Foo foo = { "foo" };
+               var foo_p = &foo;
+               assert (foo_p.s == "foo");
+       }
+       {
+               Foo bar = { "bar" };
+               unowned var bar_p = &bar;
+               assert (bar_p.s == "bar");
+       }
+}
index 6c17d35984112be9fa8ec7841d211733e9775c74..5e14de7f6475805eaa19b6e97e23e99a91e80901 100644 (file)
@@ -104,6 +104,7 @@ public class Vala.PointerIndirection : Expression {
                                return false;
                        }
                        value_type = pointer_type.base_type;
+                       value_type.value_owned = false;
                } else {
                        error = true;
                        Report.error (source_reference, "Pointer indirection not supported for this expression");