From b19c0d77e6f25ea831ab608c71f15d0d9266c8c4 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 5 Jan 2020 14:15:50 +0200 Subject: [PATCH] bpo-39055: Reject a trailing \n in base64.b64decode() with validate=True. (GH-17616) --- Lib/base64.py | 2 +- Lib/test/test_base64.py | 1 + .../next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst diff --git a/Lib/base64.py b/Lib/base64.py index 2be9c395a96..2e70223dfe7 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -82,7 +82,7 @@ def b64decode(s, altchars=None, validate=False): altchars = _bytes_from_decode_data(altchars) assert len(altchars) == 2, repr(altchars) s = s.translate(bytes.maketrans(altchars, b'+/')) - if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): + if validate and not re.fullmatch(b'[A-Za-z0-9+/]*={0,2}', s): raise binascii.Error('Non-base64 digit found') return binascii.a2b_base64(s) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 2a4cc2acad2..7dba6635d4e 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -250,6 +250,7 @@ class BaseXYTestCase(unittest.TestCase): (b'3d}==', b'\xdd'), (b'@@', b''), (b'!', b''), + (b"YWJj\n", b"abc"), (b'YWJj\nYWI=', b'abcab')) funcs = ( base64.b64decode, diff --git a/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst new file mode 100644 index 00000000000..83b1431e92f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst @@ -0,0 +1,2 @@ +:func:`base64.b64decode` with ``validate=True`` raises now a binascii.Error +if the input ends with a single ``\n``.