From: Martin Panter Date: Mon, 14 Dec 2015 03:41:59 +0000 (+0000) Subject: Issue #22088: Port base64 character ignoring doc and test from 857d9fe60169 X-Git-Tag: v2.7.12rc1~334 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d77fe94b4e2840f9031ba50d2205e97dd9115160;p=thirdparty%2FPython%2Fcpython.git Issue #22088: Port base64 character ignoring doc and test from 857d9fe60169 --- diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index 2a9840bee1d3..e346efbbc1f2 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -45,9 +45,9 @@ The modern interface, which was introduced in Python 2.4, provides: length 2 (additional characters are ignored) which specifies the alternative alphabet used instead of the ``+`` and ``/`` characters. - The decoded string is returned. A :exc:`TypeError` is raised if *s* were - incorrectly padded or if there are non-alphabet characters present in the - string. + The decoded string is returned. A :exc:`TypeError` is raised if *s* is + incorrectly padded. Non-base64-alphabet characters are + discarded prior to the padding check. .. function:: standard_b64encode(s) diff --git a/Lib/base64.py b/Lib/base64.py index 82c112c56ac7..844907feef56 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -64,9 +64,9 @@ def b64decode(s, altchars=None): length 2 (additional characters are ignored) which specifies the alternative alphabet used instead of the '+' and '/' characters. - The decoded string is returned. A TypeError is raised if s were - incorrectly padded or if there are non-alphabet characters present in the - string. + The decoded string is returned. A TypeError is raised if s is + incorrectly padded. Non-base64-alphabet characters are discarded prior + to the padding check. """ if altchars is not None: s = s.translate(string.maketrans(altchars[:2], '+/')) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 3f2cee4fded5..5dd283bb995a 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -137,9 +137,23 @@ class BaseXYTestCase(unittest.TestCase): # Non-bytes eq(base64.urlsafe_b64decode(bytearray('01a-b_cd')), '\xd3V\xbeo\xf7\x1d') - def test_b64decode_error(self): + def test_b64decode_padding_error(self): self.assertRaises(TypeError, base64.b64decode, 'abc') + def test_b64decode_invalid_chars(self): + # issue 1466065: Test some invalid characters. + tests = ((b'%3d==', b'\xdd'), + (b'$3d==', b'\xdd'), + (b'[==', b''), + (b'YW]3=', b'am'), + (b'3{d==', b'\xdd'), + (b'3d}==', b'\xdd'), + (b'@@', b''), + (b'!', b''), + (b'YWJj\nYWI=', b'abcab')) + for bstr, res in tests: + self.assertEqual(base64.b64decode(bstr), res) + def test_b32encode(self): eq = self.assertEqual eq(base64.b32encode(''), '')