8000 gh-118314: Fix padding edge case in binascii.a2b_base64 strict mode (… · python/cpython@fe47d9b · GitHub
[go: up one dir, main page]

Skip to content

Commit fe47d9b

Browse files
zhangyoufuterryjreedyeendebakpt
authored
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>
1 parent 3a6ff1b commit fe47d9b

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

Lib/test/test_binascii.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,13 +139,21 @@ def assertLeadingPadding(data, non_strict_mode_expected_result: bytes):
139139
def assertDiscontinuousPadding(data, non_strict_mode_expected_result: bytes):
140140
_assertRegexTemplate(r'(?i)Discontinuous padding', data, non_strict_mode_expected_result)
141141

142+
def assertExcessPadding(data, non_strict_mode_expected_result: bytes):
143+
_assertRegexTemplate(r'(?i)Excess padding', data, non_strict_mode_expected_result)
144+
142145
# Test excess data exceptions
143146
assertExcessData(b'ab==a', b'i')
144147
assertExcessData(b'ab===', b'i')
148+
assertExcessData(b'ab====', b'i')
145149
assertExcessData(b'ab==:', b'i')
146150
assertExcessData(b'abc=a', b'i\xb7')
147151
assertExcessData(b'abc=:', b'i\xb7')
148152
assertExcessData(b'ab==\n', b'i')
153+
assertExcessData(b'abc==', b'i\xb7')
154+
assertExcessData(b'abc===', b'i\xb7')
155+
assertExcessData(b'abc====', b'i\xb7')
156+
assertExcessData(b'abc=====', b'i\xb7')
149157

150158
# Test non-base64 data exceptions
151159
assertNonBase64Data(b'\nab==', b'i')
@@ -157,8 +165,15 @@ def assertDiscontinuousPadding(data, non_strict_mode_expected_result: bytes):
157165
assertLeadingPadding(b'=', b'')
158166
assertLeadingPadding(b'==', b'')
159167
assertLeadingPadding(b'===', b'')
168+
assertLeadingPadding(b'====', b'')
169+
assertLeadingPadding(b'=====', b'')
160170
assertDiscontinuousPadding(b'ab=c=', b'i\xb7')
161171
assertDiscontinuousPadding(b'ab=ab==', b'i\xb6\x9b')
172+
assertExcessPadding(b'abcd=', b'i\xb7\x1d')
173+
assertExcessPadding(b'abcd==', b'i\xb7\x1d')
174+
assertExcessPadding(b'abcd===', b'i\xb7\x1d')
175+
assertExcessPadding(b'abcd====', b'i\xb7\x1d')
176+
assertExcessPadding(b'abcd=====', b'i\xb7\x1d')
162177

163178

164179
def test_base64errors(self):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix an edge case in :func:`binascii.a2b_base64` strict mode, where excessive padding is not detected when no padding is necessary.

Modules/binascii.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,13 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode)
414414
if (this_ch == BASE64_PAD) {
415415
padding_started = 1;
416416

417+
if (strict_mode && quad_pos == 0) {
418+
state = get_binascii_state(module);
419+
if (state) {
420+
PyErr_SetString(state->Error, "Excess padding not allowed");
421+
}
422+
goto error_end;
423+
}
417424
if (quad_pos >= 2 && quad_pos + ++pads >= 4) {
418425
/* A pad sequence means we should not parse more input.
419426
** We've already interpreted the data from the quad at this point.

0 commit comments

Comments
 (0)
0