aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-06-16 22:41:59 +0800
committerGitHub <noreply@github.com>2017-06-16 22:41:59 +0800
commit3abadc7122f4075c64a44332507d140af17f50b5 (patch)
tree4ec51d834bc48e27975f6c39690b957a0d7d6949
parent17de4a0756ad86b6facbf592dce2a4c32ef7585c (diff)
parentc1f5016e16a29e3ce4bfe86dde2b42c3704d54c0 (diff)
downloaddexon-solidity-3abadc7122f4075c64a44332507d140af17f50b5.tar.gz
dexon-solidity-3abadc7122f4075c64a44332507d140af17f50b5.tar.zst
dexon-solidity-3abadc7122f4075c64a44332507d140af17f50b5.zip
Merge pull request #2386 from ethereum/utf8-fix
Fix UTF-8 validation for high codepoints (>10000)
-rw-r--r--Changelog.md1
-rw-r--r--libdevcore/UTF8.cpp2
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp10
3 files changed, 12 insertions, 1 deletions
diff --git a/Changelog.md b/Changelog.md
index b2e080a0..de65421a 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -10,6 +10,7 @@ Features:
* Inline Assembly: introduce ``keccak256`` as an opcode. ``sha3`` is still a valid alias.
Bugfixes:
+ * Type Checker: Make UTF8-validation a bit more sloppy to include more valid sequences.
* Fixed crash concerning non-callable types.
* Unused variable warnings no longer issued for variables used inside inline assembly.
* Inline Assembly: Enforce function arguments when parsing functional instructions.
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"(