Skip to content

Commit 053d6c5

Browse files
miss-islingtontaleinat
authored andcommitted
bpo-33770: improve base64 exception message for encoded inputs of invalid length (GH-7416) (GH-7602)
(cherry picked from commit 1b85c71) Co-authored-by: Tal Einat <taleinat+github@gmail.com>
1 parent 2adfeef commit 053d6c5

3 files changed

Lines changed: 41 additions & 1 deletion

File tree

Lib/test/test_binascii.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,34 @@ def addnoise(line):
110110
# empty strings. TBD: shouldn't it raise an exception instead ?
111111
self.assertEqual(binascii.a2b_base64(self.type2test(fillers)), b'')
112112

113+
def test_base64errors(self):
114+
# Test base64 with invalid padding
115+
def assertIncorrectPadding(data):
116+
with self.assertRaisesRegex(binascii.Error, r'(?i)Incorrect padding'):
117+
binascii.a2b_base64(self.type2test(data))
118+
119+
assertIncorrectPadding(b'ab')
120+
assertIncorrectPadding(b'ab=')
121+
assertIncorrectPadding(b'abc')
122+
assertIncorrectPadding(b'abcdef')
123+
assertIncorrectPadding(b'abcdef=')
124+
assertIncorrectPadding(b'abcdefg')
125+
assertIncorrectPadding(b'a=b=')
126+
assertIncorrectPadding(b'a\nb=')
127+
128+
# Test base64 with invalid number of valid characters (1 mod 4)
129+
def assertInvalidLength(data):
130+
with self.assertRaisesRegex(binascii.Error, r'(?i)invalid.+length'):
131+
binascii.a2b_base64(self.type2test(data))
132+
133+
assertInvalidLength(b'a')
134+
assertInvalidLength(b'a=')
135+
assertInvalidLength(b'a==')
136+
assertInvalidLength(b'a===')
137+
assertInvalidLength(b'a' * 5)
138+
assertInvalidLength(b'a' * (4 * 87 + 1))
139+
assertInvalidLength(b'A\tB\nC ??DE') # only 5 valid characters
140+
113141
def test_uu(self):
114142
MAX_UU = 45
115143
for backtick in (True, False):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
improve base64 exception message for encoded inputs of invalid length

Modules/binascii.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,18 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data)
510510
}
511511

512512
if (leftbits != 0) {
513-
PyErr_SetString(Error, "Incorrect padding");
513+
if (leftbits == 6) {
514+
/*
515+
** There is exactly one extra valid, non-padding, base64 character.
516+
** This is an invalid length, as there is no possible input that
517+
** could encoded into such a base64 string.
518+
*/
519+
PyErr_SetString(Error,
520+
"Invalid base64-encoded string: "
521+
"length cannot be 1 more than a multiple of 4");
522+
} else {
523+
PyErr_SetString(Error, "Incorrect padding");
524+
}
514525
_PyBytesWriter_Dealloc(&writer);
515526
return NULL;
516527
}

0 commit comments

Comments
 (0)