diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-06-18 10:25:33 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-06-18 10:47:27 +0000 |
commit | 3eedf7598c322519c3a04374784bb2251e8982df (patch) | |
tree | ab3c309a9491db6e748b8ccfdaab1cc031c0d359 | |
parent | 1b1296d69791aa7a7e2b8f703c8a9ea1e42b54c8 (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>
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\"\\}'" |