From 366fcbac18e3adc41e3901580dbedb6a91e41a10 Mon Sep 17 00:00:00 2001 From: Idan Moral Date: Tue, 20 Jul 2021 01:42:19 +0300 Subject: [PATCH] bpo-44678: Separate error message for discontinuous padding in binascii.a2b_base64 strict mode (GH-27249) * Renamed assertLeadingPadding function to match logic * Added a separate error message for discontinuous padding * Updated the tests for discontinuous padding --- Lib/test/test_binascii.py | 15 +++++++++------ .../2021-07-19-18-45-00.bpo-44678.YMEAu0.rst | 1 + Modules/binascii.c | 7 +++++-- 3 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-07-19-18-45-00.bpo-44678.YMEAu0.rst diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 74438d837852c8..da8f9d1f213f7d 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -130,9 +130,12 @@ def assertExcessData(data, non_strict_mode_expected_result: bytes): def assertNonBase64Data(data, non_strict_mode_expected_result: bytes): _assertRegexTemplate(r'(?i)Only base64 data', data, non_strict_mode_expected_result) - def assertMalformedPadding(data, non_strict_mode_expected_result: bytes): + def assertLeadingPadding(data, non_strict_mode_expected_result: bytes): _assertRegexTemplate(r'(?i)Leading padding', data, non_strict_mode_expected_result) + def assertDiscontinuousPadding(data, non_strict_mode_expected_result: bytes): + _assertRegexTemplate(r'(?i)Discontinuous padding', data, non_strict_mode_expected_result) + # Test excess data exceptions assertExcessData(b'ab==a', b'i') assertExcessData(b'ab===', b'i') @@ -148,11 +151,11 @@ def assertMalformedPadding(data, non_strict_mode_expected_result: bytes): assertNonBase64Data(b'a\x00b==', b'i') # Test malformed padding - assertMalformedPadding(b'=', b'') - assertMalformedPadding(b'==', b'') - assertMalformedPadding(b'===', b'') - assertMalformedPadding(b'ab=c=', b'i\xb7') - assertMalformedPadding(b'ab=ab==', b'i\xb6\x9b') + assertLeadingPadding(b'=', b'') + assertLeadingPadding(b'==', b'') + assertLeadingPadding(b'===', b'') + assertDiscontinuousPadding(b'ab=c=', b'i\xb7') + assertDiscontinuousPadding(b'ab=ab==', b'i\xb6\x9b') def test_base64errors(self): diff --git a/Misc/NEWS.d/next/Library/2021-07-19-18-45-00.bpo-44678.YMEAu0.rst b/Misc/NEWS.d/next/Library/2021-07-19-18-45-00.bpo-44678.YMEAu0.rst new file mode 100644 index 00000000000000..991b1579b2e2b6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-07-19-18-45-00.bpo-44678.YMEAu0.rst @@ -0,0 +1 @@ +Added a separate error message for discontinuous padding in *binascii.a2b_base64* strict mode. diff --git a/Modules/binascii.c b/Modules/binascii.c index 50f25b406a924e..e80eb2af49cf7e 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -464,7 +464,6 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode) unsigned char *bin_data_start = bin_data; if (strict_mode && ascii_len > 0 && ascii_data[0] == '=') { - malformed_padding: state = get_binascii_state(module); if (state) { PyErr_SetString(state->Error, "Leading padding not allowed"); @@ -516,7 +515,11 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode) // Characters that are not '=', in the middle of the padding, are not allowed if (strict_mode && padding_started) { - goto malformed_padding; + state = get_binascii_state(module); + if (state) { + PyErr_SetString(state->Error, "Discontinuous padding not allowed"); + } + goto error_end; } pads = 0;