diff options
author | ZyX <kp-pav@yandex.ru> | 2016-03-07 07:27:14 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2016-04-18 02:48:20 +0300 |
commit | 394830631f130ad646f23358bf7863e7a37c6d78 (patch) | |
tree | d92f08c3d8a64386e47b31ade25b4c08e17103ad | |
parent | b725f6b4287d800f22bce32f32022ad07aa2610e (diff) | |
download | rneovim-394830631f130ad646f23358bf7863e7a37c6d78.tar.gz rneovim-394830631f130ad646f23358bf7863e7a37c6d78.tar.bz2 rneovim-394830631f130ad646f23358bf7863e7a37c6d78.zip |
eval/decode: Make sure that U+00C3 is parsed correctly
-rw-r--r-- | src/nvim/eval/decode.c | 5 | ||||
-rw-r--r-- | test/functional/eval/json_functions_spec.lua | 4 |
2 files changed, 8 insertions, 1 deletions
diff --git a/src/nvim/eval/decode.c b/src/nvim/eval/decode.c index 35e8421716..ce2723147d 100644 --- a/src/nvim/eval/decode.c +++ b/src/nvim/eval/decode.c @@ -431,7 +431,10 @@ json_decode_string_cycle_start: // and thus cannot possibly be equal to *p. But utf_ptr2char({0xFF, // 0}) will return 0xFF, even though 0xFF cannot start any UTF-8 // code point at all. - if (ch >= 0x80 && p_byte == ch) { + // + // The only exception is U+00C3 which is represented as 0xC3 0x83. + if (ch >= 0x80 && p_byte == ch && !( + ch == 0xC3 && p + 1 < e && (uint8_t) p[1] == 0x83)) { EMSG2(_("E474: Only UTF-8 strings allowed: %s"), p); goto json_decode_string_fail; } else if (ch > 0x10FFFF) { diff --git a/test/functional/eval/json_functions_spec.lua b/test/functional/eval/json_functions_spec.lua index 59dbb804e4..7ec3882a58 100644 --- a/test/functional/eval/json_functions_spec.lua +++ b/test/functional/eval/json_functions_spec.lua @@ -447,6 +447,10 @@ describe('json_decode() function', function() eq('\xAB', funcs.json_decode('"\\u00AB"')) sp_decode_eq({_TYPE='string', _VAL={'\n\xAB\n'}}, '"\\u0000\\u00AB\\u0000"') end) + + it('parses U+00C3 correctly', function() + eq('\xC3\x83', funcs.json_decode('"\xC3\x83"')) + end) end) describe('json_encode() function', function() |