aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Beregszaszi <alex@rtfs.hu>2017-06-14 02:12:45 +0800
committerchriseth <chris@ethereum.org>2017-06-16 22:41:29 +0800
commitd7e63f23decdaf83aa4872a6e0b2754a3d69d4a6 (patch)
tree4fecd3ab7f05416a1fbb465d7f40dabb6d9b2f8d
parent17de4a0756ad86b6facbf592dce2a4c32ef7585c (diff)
downloaddexon-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.cpp2
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp10
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"(