bpo-34736: improve error message for invalid length b64decode inputs (GH-9563)
![](https://secure.gravatar.com/avatar/cc7737cd64a84f1b5c61a160798e97ee.jpg?s=120&d=mm&r=g)
https://github.com/python/cpython/commit/7e35081bc828291da5793db49ab45dee4fd... commit: 7e35081bc828291da5793db49ab45dee4fda5043 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> committer: GitHub <noreply@github.com> date: 2018-09-27T23:12:54-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 (cherry picked from commit 1fba2ffc37da52c08db51fe4360459990b0311c9) Co-authored-by: Tal Einat <taleinat+github@gmail.com> 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 7418a9ce9848..8e37d55a64f9 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 2df80affb695..d0d3f7d34b8f 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"); }
participants (1)
-
Miss Islington (bot)