[Python-checkins] bpo-34736: improve error message for invalid length b64decode inputs (GH-9563)
Miss Islington (bot)
webhook-mailer at python.org
Fri Sep 28 01:57:33 EDT 2018
https://github.com/python/cpython/commit/1fba2ffc37da52c08db51fe4360459990b0311c9
commit: 1fba2ffc37da52c08db51fe4360459990b0311c9
branch: master
author: Tal Einat <taleinat+github at gmail.com>
committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
date: 2018-09-27T22:57:22-07:00
summary:
bpo-34736: improve error message for invalid length b64decode inputs (GH-9563)
Improvements:
1. Include the number of valid data characters in the error message.
2. Mention "number of data characters" rather than "length".
https://bugs.python.org/issue34736
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 c5fcc1ac1647..572e50c3e25e 100644
--- a/Lib/test/test_binascii.py
+++ b/Lib/test/test_binascii.py
@@ -3,6 +3,7 @@
import unittest
import binascii
import array
+import re
# Note: "*_hex" functions are aliases for "(un)hexlify"
b2a_functions = ['b2a_base64', 'b2a_hex', 'b2a_hqx', 'b2a_qp', 'b2a_uu',
@@ -127,7 +128,10 @@ def assertIncorrectPadding(data):
# Test base64 with invalid number of valid characters (1 mod 4)
def assertInvalidLength(data):
- with self.assertRaisesRegex(binascii.Error, r'(?i)invalid.+length'):
+ n_data_chars = len(re.sub(br'[^A-Za-z0-9/+]', br'', data))
+ expected_errmsg_re = \
+ r'(?i)Invalid.+number of data characters.+' + str(n_data_chars)
+ with self.assertRaisesRegex(binascii.Error, expected_errmsg_re):
binascii.a2b_base64(self.type2test(data))
assertInvalidLength(b'a')
diff --git a/Modules/binascii.c b/Modules/binascii.c
index 5667018d6e1b..19589f906f72 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -438,6 +438,7 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data)
{
const unsigned char *ascii_data;
unsigned char *bin_data;
+ unsigned char *bin_data_start;
int leftbits = 0;
unsigned char this_ch;
unsigned int leftchar = 0;
@@ -461,6 +462,7 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data)
bin_data = _PyBytesWriter_Alloc(&writer, bin_len);
if (bin_data == NULL)
return NULL;
+ bin_data_start = bin_data;
for( ; ascii_len > 0; ascii_len--, ascii_data++) {
this_ch = *ascii_data;
@@ -516,9 +518,11 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data)
** This is an invalid length, as there is no possible input that
** could encoded into such a base64 string.
*/
- PyErr_SetString(Error,
- "Invalid base64-encoded string: "
- "length cannot be 1 more than a multiple of 4");
+ PyErr_Format(Error,
+ "Invalid base64-encoded string: "
+ "number of data characters (%d) cannot be 1 more "
+ "than a multiple of 4",
+ (bin_data - bin_data_start) / 3 * 4 + 1);
} else {
PyErr_SetString(Error, "Incorrect padding");
}
More information about the Python-checkins
mailing list