diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2017-06-14 02:12:45 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-06-16 22:41:29 +0800 |
commit | d7e63f23decdaf83aa4872a6e0b2754a3d69d4a6 (patch) | |
tree | 4fecd3ab7f05416a1fbb465d7f40dabb6d9b2f8d | |
parent | 17de4a0756ad86b6facbf592dce2a4c32ef7585c (diff) | |
download | dexon-solidity-d7e63f23decdaf83aa4872a6e0b2754a3d69d4a6.tar.gz dexon-solidity-d7e63f23decdaf83aa4872a6e0b2754a3d69d4a6.tar.zst dexon-solidity-d7e63f23decdaf83aa4872a6e0b2754a3d69d4a6.zip |
Fix UTF-8 validation for high codepoints (>10000)
-rw-r--r-- | libdevcore/UTF8.cpp | 2 | ||||
-rw-r--r-- | test/libsolidity/SolidityNameAndTypeResolution.cpp | 10 |
2 files changed, 11 insertions, 1 deletions
diff --git a/libdevcore/UTF8.cpp b/libdevcore/UTF8.cpp index 9fbf4b45..449ccc5d 100644 --- a/libdevcore/UTF8.cpp +++ b/libdevcore/UTF8.cpp @@ -40,7 +40,7 @@ bool validateUTF8(std::string const& _input, size_t& _invalidPosition) continue; size_t count = 0; - switch(_input[i] & 0xe0) { + switch(_input[i] & 0xf0) { case 0xc0: count = 1; break; case 0xe0: count = 2; break; case 0xf0: count = 3; break; diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 70934543..0b3cb481 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -2422,6 +2422,16 @@ BOOST_AUTO_TEST_CASE(invalid_utf8_explicit) CHECK_ERROR(sourceCode, TypeError, "Explicit type conversion not allowed"); } +BOOST_AUTO_TEST_CASE(large_utf8_codepoint) +{ + char const* sourceCode = R"( + contract C { + string s = "\xf0\x9f\xa6\x84"; + } + )"; + CHECK_SUCCESS(sourceCode); +} + BOOST_AUTO_TEST_CASE(string_index) { char const* sourceCode = R"( |