From: Serhiy Storchaka Date: Sat, 4 Apr 2026 08:37:14 +0000 (+0300) Subject: gh-148016: Improve "Leading padding not allowed" error in Base32 and Base64 decoders... X-Git-Tag: v3.15.0a8~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=113038f94072b2f3c9c2648711b4dab74e232e3e;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index a3f7c7b832ca..c8dbf3fec40b 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -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") diff --git a/Modules/binascii.c b/Modules/binascii.c index f28c0d472bba..d0ef2d2d2cc4 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -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"); }