aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-06-18 10:25:33 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2018-06-18 10:47:27 +0000
commit3eedf7598c322519c3a04374784bb2251e8982df (patch)
treeab3c309a9491db6e748b8ccfdaab1cc031c0d359
parent1b1296d69791aa7a7e2b8f703c8a9ea1e42b54c8 (diff)
Catch mis-use of "original" as default property value
This used to cause an infinite recursion, eventually crashing after running out of stack space. Change-Id: I073f7163d73a70b17bab078c8a99199bc9d21eaa Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r--src/lib/corelib/language/evaluatorscriptclass.cpp7
-rw-r--r--tests/auto/language/testdata/erroneous/modules/module-with-invalid-original/module-with-invalid-original.qbs3
-rw-r--r--tests/auto/language/testdata/erroneous/original-in-export-item.qbs14
-rw-r--r--tests/auto/language/testdata/erroneous/original-in-module-prototype.qbs5
-rw-r--r--tests/auto/language/tst_language.cpp6
5 files changed, 35 insertions, 0 deletions
diff --git a/src/lib/corelib/language/evaluatorscriptclass.cpp b/src/lib/corelib/language/evaluatorscriptclass.cpp
index b7c2576df..18d7fd83f 100644
--- a/src/lib/corelib/language/evaluatorscriptclass.cpp
+++ b/src/lib/corelib/language/evaluatorscriptclass.cpp
@@ -177,6 +177,13 @@ private:
QScriptValue originalValue;
if (data->item->propertyDeclaration(propertyName->toString()).isScalar()) {
const Item *item = itemOfProperty;
+ if (item->type() == ItemType::Module || item->type() == ItemType::Export) {
+ const QString errorMessage = Tr::tr("The special value 'original' cannot "
+ "be used on the right-hand side of a property declaration.");
+ extraScope = engine->currentContext()->throwError(errorMessage);
+ result.second = false;
+ return result;
+ }
while (item->type() == ItemType::ModuleInstance)
item = item->prototype();
if (item->type() != ItemType::Module && item->type() != ItemType::Export) {
diff --git a/tests/auto/language/testdata/erroneous/modules/module-with-invalid-original/module-with-invalid-original.qbs b/tests/auto/language/testdata/erroneous/modules/module-with-invalid-original/module-with-invalid-original.qbs
new file mode 100644
index 000000000..ef2404412
--- /dev/null
+++ b/tests/auto/language/testdata/erroneous/modules/module-with-invalid-original/module-with-invalid-original.qbs
@@ -0,0 +1,3 @@
+Module {
+ property string p: original
+}
diff --git a/tests/auto/language/testdata/erroneous/original-in-export-item.qbs b/tests/auto/language/testdata/erroneous/original-in-export-item.qbs
new file mode 100644
index 000000000..51fedb9a2
--- /dev/null
+++ b/tests/auto/language/testdata/erroneous/original-in-export-item.qbs
@@ -0,0 +1,14 @@
+import qbs
+
+Project {
+ Product {
+ name: "a"
+ Export {
+ property string p: original
+ }
+ }
+ Product {
+ name: "b"
+ Depends { name: "a" }
+ }
+}
diff --git a/tests/auto/language/testdata/erroneous/original-in-module-prototype.qbs b/tests/auto/language/testdata/erroneous/original-in-module-prototype.qbs
new file mode 100644
index 000000000..e7128092a
--- /dev/null
+++ b/tests/auto/language/testdata/erroneous/original-in-module-prototype.qbs
@@ -0,0 +1,5 @@
+import qbs
+
+Product {
+ Depends { name: "module-with-invalid-original" }
+}
diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp
index 961808f3d..4d24e773b 100644
--- a/tests/auto/language/tst_language.cpp
+++ b/tests/auto/language/tst_language.cpp
@@ -830,6 +830,12 @@ void TestLanguage::erroneousFiles_data()
QTest::newRow("original-in-product-property")
<< "original-in-product-property.qbs"
":4:21.*The special value 'original' can only be used with module properties.";
+ QTest::newRow("original-in-module-prototype")
+ << "module-with-invalid-original.qbs:2:24.*The special value 'original' cannot be used "
+ "on the right-hand side of a property declaration.";
+ QTest::newRow("original-in-export-item")
+ << "original-in-export-item.qbs:7:32.*The special value 'original' cannot be used "
+ "on the right-hand side of a property declaration.";
QTest::newRow("mismatching-multiplex-dependency")
<< "mismatching-multiplex-dependency.qbs:9:5.*Dependency from product "
"'b \\{\"architecture\":\"mips\"\\}' to product 'a \\{\"architecture\":\"mips\"\\}'"