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]