]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-30566: Fix IndexError when using punycode codec (GH-18632)
authorBerker Peksag <berker.peksag@gmail.com>
Tue, 25 Feb 2020 03:19:03 +0000 (06:19 +0300)
committerGitHub <noreply@github.com>
Tue, 25 Feb 2020 03:19:03 +0000 (06:19 +0300)
Trying to decode an invalid string with the punycode codec
shoud raise UnicodeError.

Lib/encodings/punycode.py
Lib/test/test_codecs.py
Misc/NEWS.d/next/Library/2020-02-24-03-45-28.bpo-30566.qROxty.rst [new file with mode: 0644]

index 66c51013ea431ace41d4c7b20da8df3349dc834c..1c5726447077b1716e4fa772ff85345c54d441f2 100644 (file)
@@ -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)
index 3aec34c7f167d649589016022b040b0ebdfcd5e8..8d9cb9089039cf2492035bbbeba136cac2798ac2 100644 (file)
@@ -1343,6 +1343,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 = [
diff --git a/Misc/NEWS.d/next/Library/2020-02-24-03-45-28.bpo-30566.qROxty.rst b/Misc/NEWS.d/next/Library/2020-02-24-03-45-28.bpo-30566.qROxty.rst
new file mode 100644 (file)
index 0000000..c780633
--- /dev/null
@@ -0,0 +1,2 @@
+Fix :exc:`IndexError` when trying to decode an invalid string with punycode
+codec.