Skip to content

Commit 8a3e4e5

Browse files
Encode a whole number of bytes per line.
1 parent cb4af0e commit 8a3e4e5

File tree

3 files changed

+7
-4
lines changed

3 files changed

+7
-4
lines changed

Lib/test/test_base64.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,9 @@ def test_b64encode_wrapcol(self):
214214
b = b'www.python.org'
215215
eq(base64.b64encode(b, wrapcol=0), b'd3d3LnB5dGhvbi5vcmc=')
216216
eq(base64.b64encode(b, wrapcol=8), b'd3d3LnB5\ndGhvbi5v\ncmc=')
217+
eq(base64.b64encode(b, wrapcol=11), b'd3d3LnB5\ndGhvbi5v\ncmc=')
217218
eq(base64.b64encode(b, wrapcol=76), b'd3d3LnB5dGhvbi5vcmc=')
218-
eq(base64.b64encode(b, wrapcol=1),
219-
b'd\n3\nd\n3\nL\nn\nB\n5\nd\nG\nh\nv\nb\ni\n5\nv\nc\nm\nc\n=')
219+
eq(base64.b64encode(b, wrapcol=1), b'd3d3\nLnB5\ndGhv\nbi5v\ncmc=')
220220
eq(base64.b64encode(b, wrapcol=sys.maxsize), b'd3d3LnB5dGhvbi5vcmc=')
221221
if check_impl_detail():
222222
eq(base64.b64encode(b, wrapcol=sys.maxsize*2),

Lib/test/test_binascii.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,12 +493,14 @@ def test_b2a_base64_wrapcol(self):
493493
b'd3d3LnB5dGhvbi5vcmc=\n')
494494
self.assertEqual(binascii.b2a_base64(b, wrapcol=8),
495495
b'd3d3LnB5\ndGhvbi5v\ncmc=\n')
496+
self.assertEqual(binascii.b2a_base64(b, wrapcol=11),
497+
b'd3d3LnB5\ndGhvbi5v\ncmc=\n')
496498
self.assertEqual(binascii.b2a_base64(b, wrapcol=76),
497499
b'd3d3LnB5dGhvbi5vcmc=\n')
498500
self.assertEqual(binascii.b2a_base64(b, wrapcol=8, newline=False),
499501
b'd3d3LnB5\ndGhvbi5v\ncmc=')
500502
self.assertEqual(binascii.b2a_base64(b, wrapcol=1),
501-
b'd\n3\nd\n3\nL\nn\nB\n5\nd\nG\nh\nv\nb\ni\n5\nv\nc\nm\nc\n=\n')
503+
b'd3d3\nLnB5\ndGhv\nbi5v\ncmc=\n')
502504
self.assertEqual(binascii.b2a_base64(b, wrapcol=sys.maxsize),
503505
b'd3d3LnB5dGhvbi5vcmc=\n')
504506
if check_impl_detail():

Modules/binascii.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,6 @@ binascii_b2a_base64_impl(PyObject *module, Py_buffer *data, size_t wrapcol,
565565

566566
const unsigned char *bin_data = data->buf;
567567
Py_ssize_t bin_len = data->len;
568-
569568
assert(bin_len >= 0);
570569

571570
/* Each group of 3 bytes (rounded up) gets encoded as 4 characters,
@@ -579,6 +578,8 @@ binascii_b2a_base64_impl(PyObject *module, Py_buffer *data, size_t wrapcol,
579578
goto toolong;
580579
}
581580
if (wrapcol && out_len) {
581+
/* Each line should encode a whole number of bytes. */
582+
wrapcol = wrapcol < 4 ? 4 : wrapcol / 4 * 4;
582583
out_len += (out_len - 1u) / wrapcol;
583584
if (out_len > PY_SSIZE_T_MAX) {
584585
goto toolong;

0 commit comments

Comments
 (0)