diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-06-25 08:54:18 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-25 08:54:18 (GMT) |
commit | 894263ba80af4b7733c2df95b527e96953922656 (patch) | |
tree | 4d779773185514744e39f6e9560563540b9047b6 /Objects/unicodeobject.c | |
parent | 9fe42b49c79c453d905d0395150ba0607fbab18b (diff) | |
download | cpython-894263ba80af4b7733c2df95b527e96953922656.zip cpython-894263ba80af4b7733c2df95b527e96953922656.tar.gz cpython-894263ba80af4b7733c2df95b527e96953922656.tar.bz2 |
bpo-24214: Fixed the UTF-8 and UTF-16 incremental decoders. (GH-14304)
* The UTF-8 incremental decoders fails now fast if encounter
a sequence that can't be handled by the error handler.
* The UTF-16 incremental decoders with the surrogatepass error
handler decodes now a lone low surrogate with final=False.
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 625be4b..cb1456e 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -4945,11 +4945,15 @@ unicode_decode_utf8(const char *s, Py_ssize_t size, endinpos = startinpos + 1; break; case 2: - case 3: - case 4: - if (s == end || consumed) { + if (consumed && (unsigned char)s[0] == 0xED && end - s == 2 + && (unsigned char)s[1] >= 0xA0 && (unsigned char)s[1] <= 0xBF) + { + /* Truncated surrogate code in range D800-DFFF */ goto End; } + /* fall through */ + case 3: + case 4: errmsg = "invalid continuation byte"; startinpos = s - starts; endinpos = startinpos + ch - 1; |