summaryrefslogtreecommitdiff
path: root/Modules/_json.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2013-11-26 21:27:11 +0200
committerSerhiy Storchaka <storchaka@gmail.com>2013-11-26 21:27:11 +0200
commit69dec63c6909ed56f12cb86ce8da610e12910727 (patch)
treee6961d340d6feeda954fded6ce3ea2d92869f1ef /Modules/_json.c
parentdc58945c84ffbfcef5b6ed13ab89338e6a2c06b6 (diff)
parent7131376f0ecacba73a5ff8098a5a44d113fe45ea (diff)
downloadcpython-69dec63c6909ed56f12cb86ce8da610e12910727.tar.gz
Issue #11489: JSON decoder now accepts lone surrogates.
Diffstat (limited to 'Modules/_json.c')
-rw-r--r--Modules/_json.c26
1 files changed, 7 insertions, 19 deletions
diff --git a/Modules/_json.c b/Modules/_json.c
index 301bc87d27..125101fa7c 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