]> granicus.if.org Git - python/commitdiff
Issue #22406: Fixed the uu_codec codec incorrectly ported to 3.x.
authorSerhiy Storchaka <storchaka@gmail.com>
Fri, 7 Nov 2014 12:04:37 +0000 (14:04 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Fri, 7 Nov 2014 12:04:37 +0000 (14:04 +0200)
Based on patch by Martin Panter.

Lib/encodings/uu_codec.py
Lib/test/test_codecs.py
Lib/test/test_uu.py
Misc/NEWS

index 14540950af6a8446c591ef92275258f3c5b19acd..2a5728fb5b74ad648dc2265afb34010d2d0a0552 100644 (file)
@@ -54,7 +54,7 @@ def uu_decode(input, errors='strict'):
             data = binascii.a2b_uu(s)
         except binascii.Error as v:
             # Workaround for broken uuencoders by /Fredrik Lundh
-            nbytes = (((ord(s[0])-32) & 63) * 4 + 5) / 3
+            nbytes = (((s[0]-32) & 63) * 4 + 5) // 3
             data = binascii.a2b_uu(s[:nbytes])
             #sys.stderr.write("Warning: %s\n" % str(v))
         write(data)
index 856126c4a45995d6a2fe2f5360adb01c870321e5..d4a066057796e114b6234b060cad7e717e681fce 100644 (file)
@@ -2563,6 +2563,10 @@ class TransformCodecTest(unittest.TestCase):
                     info = codecs.lookup(alias)
                     self.assertEqual(info.name, expected_name)
 
+    def test_uu_invalid(self):
+        # Missing "begin" line
+        self.assertRaises(ValueError, codecs.decode, b"", "uu-codec")
+
 
 # The codec system tries to wrap exceptions in order to ensure the error
 # mentions the operation being performed and the codec involved. We
index cbf6724fd2d371071333cec4a6942aa123fbb74b..25fffbf9936af54b9f1017a084514cc528df9daf 100644 (file)
@@ -93,6 +93,28 @@ class UUTest(unittest.TestCase):
         except uu.Error as e:
             self.assertEqual(str(e), "No valid begin line found in input file")
 
+    def test_garbage_padding(self):
+        # Issue #22406
+        encodedtext = (
+            b"begin 644 file\n"
+            # length 1; bits 001100 111111 111111 111111
+            b"\x21\x2C\x5F\x5F\x5F\n"
+            b"\x20\n"
+            b"end\n"
+        )
+        plaintext = b"\x33"  # 00110011
+
+        with self.subTest("uu.decode()"):
+            inp = io.BytesIO(encodedtext)
+            out = io.BytesIO()
+            uu.decode(inp, out, quiet=True)
+            self.assertEqual(out.getvalue(), plaintext)
+
+        with self.subTest("uu_codec"):
+            import codecs
+            decoded = codecs.decode(encodedtext, "uu_codec")
+            self.assertEqual(decoded, plaintext)
+
 class UUStdIOTest(unittest.TestCase):
 
     def setUp(self):
index 452fed3d9d44bd76a0c58e0454826d4f8a0e7e65..c59cd1a362f46c3412da2392744539604e70d94c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -36,6 +36,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #22406: Fixed the uu_codec codec incorrectly ported to 3.x.
+  Based on patch by Martin Panter.
+
 - Issue #17293: uuid.getnode() now determines MAC address on AIX using netstat.
   Based on patch by Aivars Kalvāns.