summaryrefslogtreecommitdiffstats
path: root/Objects/unicodeobject.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-06-25 08:54:18 (GMT)
committerGitHub <noreply@github.com>2019-06-25 08:54:18 (GMT)
commit894263ba80af4b7733c2df95b527e96953922656 (patch)
tree4d779773185514744e39f6e9560563540b9047b6 /Objects/unicodeobject.c
parent9fe42b49c79c453d905d0395150ba0607fbab18b (diff)
downloadcpython-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.c10
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;