diff options
author | chriseth <chris@ethereum.org> | 2017-08-28 20:50:18 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-08-28 21:13:02 +0800 |
commit | 122e65f8f496b0b20406cc968a2e48e6434d1a8f (patch) | |
tree | b623153dd3a068c45781e206e7c4b742f8d6cf7f | |
parent | d15cde2aa88f39f67025bd40168f219232dad1d6 (diff) | |
download | dexon-solidity-122e65f8f496b0b20406cc968a2e48e6434d1a8f.tar.gz dexon-solidity-122e65f8f496b0b20406cc968a2e48e6434d1a8f.tar.zst dexon-solidity-122e65f8f496b0b20406cc968a2e48e6434d1a8f.zip |
Crash fix, parseTypeName can return null.
-rw-r--r-- | Changelog.md | 2 | ||||
-rw-r--r-- | libsolidity/parsing/Parser.cpp | 5 | ||||
-rw-r--r-- | test/libsolidity/SolidityParser.cpp | 12 |
3 files changed, 18 insertions, 1 deletions
diff --git a/Changelog.md b/Changelog.md index 670182af..49855369 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,8 @@ Features: * Type Checker: Warn on using literals as tight packing parameters in ``keccak256``, ``sha3``, ``sha256`` and ``ripemd160``. Bugfixes: + * Parser: Crash fix related to parseTypeName. + ### 0.4.16 (2017-08-24) diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index 4fc8fd13..ce8a9f01 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -1244,7 +1244,10 @@ ASTPointer<Expression> Parser::parseLeftHandSideExpression( { expectToken(Token::New); ASTPointer<TypeName> typeName(parseTypeName(false)); - nodeFactory.setEndPositionFromNode(typeName); + if (typeName) + nodeFactory.setEndPositionFromNode(typeName); + else + nodeFactory.markEndPosition(); expression = nodeFactory.createNode<NewExpression>(typeName); } else diff --git a/test/libsolidity/SolidityParser.cpp b/test/libsolidity/SolidityParser.cpp index a39e0958..60ca03c9 100644 --- a/test/libsolidity/SolidityParser.cpp +++ b/test/libsolidity/SolidityParser.cpp @@ -1602,6 +1602,18 @@ BOOST_AUTO_TEST_CASE(interface) BOOST_CHECK(successParse(text)); } +BOOST_AUTO_TEST_CASE(newInvalidTypeName) +{ + char const* text = R"( + contract C { + function f() { + new var; + } + } + )"; + CHECK_PARSE_ERROR(text, "Expected explicit type name"); +} + BOOST_AUTO_TEST_SUITE_END() } |