bpo-30566: Fix IndexError when using punycode codec (GH-18632)
Trying to decode an invalid string with the punycode codec
shoud raise UnicodeError.
(cherry picked from commit ba22e8f174
)
Co-authored-by: Berker Peksag <berker.peksag@gmail.com>
This commit is contained in:
parent
1f4cf0c22b
commit
daef21ce7d
|
@ -143,7 +143,7 @@ def decode_generalized_number(extended, extpos, bias, errors):
|
|||
digit = char - 22 # 0x30-26
|
||||
elif errors == "strict":
|
||||
raise UnicodeError("Invalid extended code point '%s'"
|
||||
% extended[extpos])
|
||||
% extended[extpos-1])
|
||||
else:
|
||||
return extpos, None
|
||||
t = T(j, bias)
|
||||
|
|
|
@ -1331,6 +1331,18 @@ class PunycodeTest(unittest.TestCase):
|
|||
puny = puny.decode("ascii").encode("ascii")
|
||||
self.assertEqual(uni, puny.decode("punycode"))
|
||||
|
||||
def test_decode_invalid(self):
|
||||
testcases = [
|
||||
(b"xn--w&", "strict", UnicodeError()),
|
||||
(b"xn--w&", "ignore", "xn-"),
|
||||
]
|
||||
for puny, errors, expected in testcases:
|
||||
with self.subTest(puny=puny, errors=errors):
|
||||
if isinstance(expected, Exception):
|
||||
self.assertRaises(UnicodeError, puny.decode, "punycode", errors)
|
||||
else:
|
||||
self.assertEqual(puny.decode("punycode", errors), expected)
|
||||
|
||||
|
||||
# From http://www.gnu.org/software/libidn/draft-josefsson-idn-test-vectors.html
|
||||
nameprep_tests = [
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix :exc:`IndexError` when trying to decode an invalid string with punycode
|
||||
codec.
|
Loading…
Reference in New Issue