https://github.com/python/cpython/commit/113038f94072b2f3c9c2648711b4dab74e232e3e
commit: 113038f94072b2f3c9c2648711b4dab74e232e3e
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-04-04T08:37:14Z
summary:

gh-148016: Improve "Leading padding not allowed" error in Base32 and Base64 
decoders (GH-148017)

It is now raised instead of "Excess padding not allowed" if all characters
preceding "=" were ignored.

files:
M Lib/test/test_binascii.py
M Modules/binascii.c

diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py
index a3f7c7b832ca68..c8dbf3fec40bb7 100644
--- a/Lib/test/test_binascii.py
+++ b/Lib/test/test_binascii.py
@@ -171,8 +171,8 @@ def _assertRegexTemplate(assert_regex, data,
             self.assertEqual(binascii.a2b_base64(data),
                              non_strict_mode_expected_result)
 
-        def assertLeadingPadding(*args):
-            _assertRegexTemplate(r'(?i)Leading padding', *args)
+        def assertLeadingPadding(*args, **kwargs):
+            _assertRegexTemplate(r'(?i)Leading padding', *args, **kwargs)
 
         def assertDiscontinuousPadding(*args):
             _assertRegexTemplate(r'(?i)Discontinuous padding', *args)
@@ -203,6 +203,7 @@ def assertInvalidLength(data, *args, length=None, **kwargs):
         assertLeadingPadding(b'===abcd', b'i\xb7\x1d')
         assertLeadingPadding(b'====abcd', b'i\xb7\x1d')
         assertLeadingPadding(b'=====abcd', b'i\xb7\x1d')
+        assertLeadingPadding(b' =abcd', b'i\xb7\x1d', ignorechars=b' ')
 
         assertInvalidLength(b'a=b==', b'i')
         assertInvalidLength(b'a=bc=', b'i\xb7')
@@ -785,8 +786,8 @@ def assertExcessData(*args):
         def assertExcessPadding(*args):
             _assertRegexTemplate(r"(?i)Excess padding", *args)
 
-        def assertLeadingPadding(*args):
-            _assertRegexTemplate(r"(?i)Leading padding", *args)
+        def assertLeadingPadding(*args, **kwargs):
+            _assertRegexTemplate(r"(?i)Leading padding", *args, **kwargs)
 
         def assertIncorrectPadding(*args):
             _assertRegexTemplate(r"(?i)Incorrect padding", *args)
@@ -853,6 +854,7 @@ def assertInvalidLength(data, *args, length=None, **kwargs):
         assertLeadingPadding(b"=======BEEFCAKE", b"\t\x08Q\x01D")
         assertLeadingPadding(b"========BEEFCAKE", b"\t\x08Q\x01D")
         assertLeadingPadding(b"=========BEEFCAKE", b"\t\x08Q\x01D")
+        assertLeadingPadding(b" =BEEFCAKE", ignorechars=b' ')
 
         assertIncorrectPadding(b"AB")
         assertIncorrectPadding(b"ABCD")
diff --git a/Modules/binascii.c b/Modules/binascii.c
index f28c0d472bba27..d0ef2d2d2cc4ce 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -816,8 +816,9 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, 
int strict_mode,
             }
             state = get_binascii_state(module);
             if (state) {
+                unsigned char *bin_data_start = PyBytesWriter_GetData(writer);
                 PyErr_SetString(state->Error,
-                                (quad_pos == 0 && ascii_data == data->buf)
+                                (quad_pos == 0 && bin_data == bin_data_start)
                                 ? "Leading padding not allowed"
                                 : "Excess padding not allowed");
             }
@@ -1601,8 +1602,9 @@ binascii_a2b_base32_impl(PyObject *module, Py_buffer 
*data,
             }
             state = get_binascii_state(module);
             if (state) {
+                unsigned char *bin_data_start = PyBytesWriter_GetData(writer);
                 PyErr_SetString(state->Error,
-                                (octa_pos == 0 && ascii_data == data->buf)
+                                (octa_pos == 0 && bin_data == bin_data_start)
                                 ? "Leading padding not allowed"
                                 : "Excess padding not allowed");
             }

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to