]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-148016: Improve "Leading padding not allowed" error in Base32 and Base64 decoders...
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 4 Apr 2026 08:37:14 +0000 (11:37 +0300)
committerGitHub <noreply@github.com>
Sat, 4 Apr 2026 08:37:14 +0000 (08:37 +0000)
It is now raised instead of "Excess padding not allowed" if all characters
preceding "=" were ignored.

Lib/test/test_binascii.py
Modules/binascii.c

index a3f7c7b832ca68f7947eb1494bffe38b431a7dfb..c8dbf3fec40bb745f2c1531bf24dc2846e5fe31f 100644 (file)
@@ -171,8 +171,8 @@ class BinASCIITest(unittest.TestCase):
             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 @@ class BinASCIITest(unittest.TestCase):
         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 @@ class BinASCIITest(unittest.TestCase):
         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 @@ class BinASCIITest(unittest.TestCase):
         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")
index f28c0d472bba274b3c0604ca2e4110b1650d6a0a..d0ef2d2d2cc4ce08b94142da3b893d987195448d 100644 (file)
@@ -816,8 +816,9 @@ fastpath:
             }
             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 @@ fastpath:
             }
             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");
             }