Skip to content

Commit df75136

Browse files
authored
gh-125660: Reject invalid unicode escapes for Python implementation of JSON decoder (GH-125683)
1 parent d358425 commit df75136

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

Lib/json/decoder.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -50,17 +50,18 @@ def __reduce__(self):
5050
}
5151

5252

53+
HEXDIGITS = re.compile(r'[0-9A-Fa-f]{4}', FLAGS)
5354
STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS)
5455
BACKSLASH = {
5556
'"': '"', '\\': '\\', '/': '/',
5657
'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t',
5758
}
5859

59-
def _decode_uXXXX(s, pos):
60-
esc = s[pos + 1:pos + 5]
61-
if len(esc) == 4 and esc[1] not in 'xX':
60+
def _decode_uXXXX(s, pos, _m=HEXDIGITS.match):
61+
esc = _m(s, pos + 1)
62+
if esc is not None:
6263
try:
63-
return int(esc, 16)
64+
return int(esc.group(), 16)
6465
except ValueError:
6566
pass
6667
msg = "Invalid \\uXXXX escape"

Lib/test/test_json/test_scanstring.py

+10
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ def test_bad_escapes(self):
116116
'"\\u012z"',
117117
'"\\u0x12"',
118118
'"\\u0X12"',
119+
'"\\u{0}"'.format("\uff10" * 4),
120+
'"\\u 123"',
121+
'"\\u-123"',
122+
'"\\u+123"',
123+
'"\\u1_23"',
119124
'"\\ud834\\"',
120125
'"\\ud834\\u"',
121126
'"\\ud834\\ud"',
@@ -127,6 +132,11 @@ def test_bad_escapes(self):
127132
'"\\ud834\\udd2z"',
128133
'"\\ud834\\u0x20"',
129134
'"\\ud834\\u0X20"',
135+
'"\\ud834\\u{0}"'.format("\uff10" * 4),
136+
'"\\ud834\\u 123"',
137+
'"\\ud834\\u-123"',
138+
'"\\ud834\\u+123"',
139+
'"\\ud834\\u1_23"',
130140
]
131141
for s in bad_escapes:
132142
with self.assertRaises(self.JSONDecodeError, msg=s):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Reject invalid unicode escapes for Python implementation of :func:`json.loads`.

0 commit comments

Comments
 (0)