summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYoufu Zhang <1315097+zhangyoufu@users.noreply.github.com>2024-05-07 09:18:45 (GMT)
committerGitHub <noreply@github.com>2024-05-07 09:18:45 (GMT)
commitfe47d9bee319528ffeb5fd60a615d7f02c7b5585 (patch)
tree3f4b3040b7899cb86a994ba098f3f63b9f53d34a
parent3a6ff1b1d959549546f533b18ec71aa21516328d (diff)
downloadcpython-fe47d9bee319528ffeb5fd60a615d7f02c7b5585.zip
cpython-fe47d9bee319528ffeb5fd60a615d7f02c7b5585.tar.gz
cpython-fe47d9bee319528ffeb5fd60a615d7f02c7b5585.tar.bz2
gh-118314: Fix padding edge case in binascii.a2b_base64 strict mode (GH-118320)
Fix an edge case in `binascii.a2b_base64` strict mode, where excessive padding was not detected when no padding is necessary. Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu> Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
-rw-r--r--Lib/test/test_binascii.py15
-rw-r--r--Misc/NEWS.d/next/Library/2024-04-26-12-42-29.gh-issue-118314.Z7reGc.rst1
-rw-r--r--Modules/binascii.c7
3 files changed, 23 insertions, 0 deletions
diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py
index 82dea8a..1f3b674 100644
--- a/Lib/test/test_binascii.py
+++ b/Lib/test/test_binascii.py
@@ -139,13 +139,21 @@ class BinASCIITest(unittest.TestCase):
def assertDiscontinuousPadding(data, non_strict_mode_expected_result: bytes):
_assertRegexTemplate(r'(?i)Discontinuous padding', data, non_strict_mode_expected_result)
+ def assertExcessPadding(data, non_strict_mode_expected_result: bytes):
+ _assertRegexTemplate(r'(?i)Excess padding', data, non_strict_mode_expected_result)
+
# Test excess data exceptions
assertExcessData(b'ab==a', b'i')
assertExcessData(b'ab===', b'i')
+ assertExcessData(b'ab====', b'i')
assertExcessData(b'ab==:', b'i')
assertExcessData(b'abc=a', b'i\xb7')
assertExcessData(b'abc=:', b'i\xb7')
assertExcessData(b'ab==\n', b'i')
+ assertExcessData(b'abc==', b'i\xb7')
+ assertExcessData(b'abc===', b'i\xb7')
+ assertExcessData(b'abc====', b'i\xb7')
+ assertExcessData(b'abc=====', b'i\xb7')
# Test non-base64 data exceptions
assertNonBase64Data(b'\nab==', b'i')
@@ -157,8 +165,15 @@ class BinASCIITest(unittest.TestCase):
assertLeadingPadding(b'=', b'')
assertLeadingPadding(b'==', b'')
assertLeadingPadding(b'===', b'')
+ assertLeadingPadding(b'====', b'')
+ assertLeadingPadding(b'=====', b'')
assertDiscontinuousPadding(b'ab=c=', b'i\xb7')
assertDiscontinuousPadding(b'ab=ab==', b'i\xb6\x9b')
+ assertExcessPadding(b'abcd=', b'i\xb7\x1d')
+ assertExcessPadding(b'abcd==', b'i\xb7\x1d')
+ assertExcessPadding(b'abcd===', b'i\xb7\x1d')
+ assertExcessPadding(b'abcd====', b'i\xb7\x1d')
+ assertExcessPadding(b'abcd=====', b'i\xb7\x1d')
def test_base64errors(self):
diff --git a/Misc/NEWS.d/next/Library/2024-04-26-12-42-29.gh-issue-118314.Z7reGc.rst b/Misc/NEWS.d/next/Library/2024-04-26-12-42-29.gh-issue-118314.Z7reGc.rst
new file mode 100644
index 0000000..ff3ee68
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-04-26-12-42-29.gh-issue-118314.Z7reGc.rst
@@ -0,0 +1 @@
+Fix an edge case in :func:`binascii.a2b_base64` strict mode, where excessive padding is not detected when no padding is necessary.
diff --git a/Modules/binascii.c b/Modules/binascii.c
index 250f03a..6bb01d1 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -414,6 +414,13 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode)
if (this_ch == BASE64_PAD) {
padding_started = 1;
+ if (strict_mode && quad_pos == 0) {
+ state = get_binascii_state(module);
+ if (state) {
+ PyErr_SetString(state->Error, "Excess padding not allowed");
+ }
+ goto error_end;
+ }
if (quad_pos >= 2 && quad_pos + ++pads >= 4) {
/* A pad sequence means we should not parse more input.
** We've already interpreted the data from the quad at this point.