From 312e4a5aec0ff6e0f02fb0ee71b7cfe9647f3685 Mon Sep 17 00:00:00 2001 From: Vikram Hegde Date: Sun, 4 Jun 2017 10:04:08 -0700 Subject: [PATCH] Fix for issue bpo-30566 --- Lib/encodings/punycode.py | 2 +- Lib/test/test_codecs.py | 11 +++++++++++ Misc/ACKS | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Lib/encodings/punycode.py b/Lib/encodings/punycode.py index 66c51013ea431a..1c5726447077b1 100644 --- a/Lib/encodings/punycode.py +++ b/Lib/encodings/punycode.py @@ -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) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 1e63ed8d79381b..dbbd3e3c3a9abd 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1335,6 +1335,11 @@ def test_recoding(self): if len(i)!=2: print(repr(i)) +punycode_decode_exceptions = [ + (b"xn--w&", + UnicodeError), + ] + class PunycodeTest(unittest.TestCase): def test_encode(self): @@ -1355,6 +1360,12 @@ def test_decode(self): puny = puny.decode("ascii").encode("ascii") self.assertEqual(uni, puny.decode("punycode")) + # Make sure punycode codec raises the right kind of exception + # when given invalid punycode to decode + def test_decode_exceptions(self): + for byt, exception in punycode_decode_exceptions: + with self.assertRaises(exception): + byt.decode('punycode') class UnicodeInternalTest(unittest.TestCase): @unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t') diff --git a/Misc/ACKS b/Misc/ACKS index 3000bc36d2c621..4b4db855de027b 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -605,6 +605,7 @@ Rycharde Hawkes Ben Hayden Jochen Hayek Tim Heaney +Vikram Hegde Henrik Heimbuerger Christian Heimes Thomas Heller