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:
Miss Islington (bot) 2020-02-24 19:42:39 -08:00 committed by GitHub
parent 1f4cf0c22b
commit daef21ce7d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 1 deletions

View File

@ -143,7 +143,7 @@ def decode_generalized_number(extended, extpos, bias, errors):
digit = char - 22 # 0x30-26 digit = char - 22 # 0x30-26
elif errors == "strict": elif errors == "strict":
raise UnicodeError("Invalid extended code point '%s'" raise UnicodeError("Invalid extended code point '%s'"
% extended[extpos]) % extended[extpos-1])
else: else:
return extpos, None return extpos, None
t = T(j, bias) t = T(j, bias)

View File

@ -1331,6 +1331,18 @@ class PunycodeTest(unittest.TestCase):
puny = puny.decode("ascii").encode("ascii") puny = puny.decode("ascii").encode("ascii")
self.assertEqual(uni, puny.decode("punycode")) 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 # From http://www.gnu.org/software/libidn/draft-josefsson-idn-test-vectors.html
nameprep_tests = [ nameprep_tests = [

View File

@ -0,0 +1,2 @@
Fix :exc:`IndexError` when trying to decode an invalid string with punycode
codec.