summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_json.c26
1 files changed, 7 insertions, 19 deletions
diff --git a/Modules/_json.c b/Modules/_json.c
index 301bc87..125101f 100644
--- a/Modules/_json.c
+++ b/Modules/_json.c
@@ -409,17 +409,10 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
}
}
/* Surrogate pair */
- if (Py_UNICODE_IS_HIGH_SURROGATE(c)) {
+ if (Py_UNICODE_IS_HIGH_SURROGATE(c) && end + 6 < len &&
+ PyUnicode_READ(kind, buf, next++) == '\\' &&
+ PyUnicode_READ(kind, buf, next++) == 'u') {
Py_UCS4 c2 = 0;
- if (end + 6 >= len) {
- raise_errmsg("Unpaired high surrogate", pystr, end - 5);
- goto bail;
- }
- if (PyUnicode_READ(kind, buf, next++) != '\\' ||
- PyUnicode_READ(kind, buf, next++) != 'u') {
- raise_errmsg("Unpaired high surrogate", pystr, end - 5);
- goto bail;
- }
end += 6;
/* Decode 4 hex digits */
for (; next < end; next++) {
@@ -440,15 +433,10 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
goto bail;
}
}
- if (!Py_UNICODE_IS_LOW_SURROGATE(c2)) {
- raise_errmsg("Unpaired high surrogate", pystr, end - 5);
- goto bail;
- }
- c = Py_UNICODE_JOIN_SURROGATES(c, c2);
- }
- else if (Py_UNICODE_IS_LOW_SURROGATE(c)) {
- raise_errmsg("Unpaired low surrogate", pystr, end - 5);
- goto bail;
+ if (Py_UNICODE_IS_LOW_SURROGATE(c2))
+ c = Py_UNICODE_JOIN_SURROGATES(c, c2);
+ else
+ end -= 6;
}
}
APPEND_OLD_CHUNK