Skip to content

Commit 8adaf2c

Browse files
committed
Allow up to sys.maxsize output length when encoding base 85
1 parent 3cdc3c5 commit 8adaf2c

File tree

2 files changed

+30
-26
lines changed

2 files changed

+30
-26
lines changed

Modules/binascii.c

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -974,7 +974,7 @@ binascii.b2a_ascii85
974974
Emit 'y' as a short form encoding four spaces.
975975
wrap: bool = False
976976
Wrap result in '<~' and '~>' as in Adobe Ascii85.
977-
width: unsigned_int(bitwise=True) = 0
977+
width: size_t = 0
978978
Split result into lines of provided width.
979979
pad: bool = False
980980
Pad input to a multiple of 4 before encoding.
@@ -984,8 +984,8 @@ Ascii85-encode data.
984984

985985
static PyObject *
986986
binascii_b2a_ascii85_impl(PyObject *module, Py_buffer *data, int fold_spaces,
987-
int wrap, unsigned int width, int pad)
988-
/*[clinic end generated code: output=78426392ad3fc75b input=d5122dbab4dbb9f2]*/
987+
int wrap, size_t width, int pad)
988+
/*[clinic end generated code: output=ed9758c1273a1bc3 input=7b0644a4b6a586bd]*/
989989
{
990990
const unsigned char *bin_data = data->buf;
991991
Py_ssize_t bin_len = data->len;
@@ -997,7 +997,7 @@ binascii_b2a_ascii85_impl(PyObject *module, Py_buffer *data, int fold_spaces,
997997
}
998998

999999
/* Allocate output buffer. */
1000-
Py_ssize_t out_len = 5 * ((bin_len + 3) / 4);
1000+
size_t out_len = ((size_t)bin_len + 3) / 4 * 5;
10011001
if (wrap) {
10021002
out_len += 4;
10031003
}
@@ -1007,6 +1007,14 @@ binascii_b2a_ascii85_impl(PyObject *module, Py_buffer *data, int fold_spaces,
10071007
if (width && out_len) {
10081008
out_len += (out_len - 1) / width;
10091009
}
1010+
if (out_len > PY_SSIZE_T_MAX) {
1011+
binascii_state *state = get_binascii_state(module);
1012+
if (state == NULL) {
1013+
return NULL;
1014+
}
1015+
PyErr_SetString(state->Error, "Too much data for Ascii85");
1016+
return NULL;
1017+
}
10101018

10111019
PyBytesWriter *writer = PyBytesWriter_Create(out_len);
10121020
if (writer == NULL) {
@@ -1166,21 +1174,29 @@ internal_a2b_base85(PyObject *module, Py_buffer *data, int strict_mode,
11661174

11671175
static PyObject *
11681176
internal_b2a_base85(PyObject *module, Py_buffer *data, int pad, int newline,
1169-
const unsigned char table_b2a[])
1177+
const unsigned char table_b2a[], const char *name)
11701178
{
11711179
const unsigned char *bin_data = data->buf;
11721180
Py_ssize_t bin_len = data->len;
11731181

11741182
assert(bin_len >= 0);
11751183

11761184
/* Allocate output buffer. */
1177-
Py_ssize_t out_len = 5 * ((bin_len + 3) / 4);
1185+
size_t out_len = ((size_t)bin_len + 3) / 4 * 5;
11781186
if (!pad && (bin_len % 4)) {
11791187
out_len -= 4 - (bin_len % 4);
11801188
}
11811189
if (newline) {
11821190
out_len++;
11831191
}
1192+
if (out_len > PY_SSIZE_T_MAX) {
1193+
binascii_state *state = get_binascii_state(module);
1194+
if (state == NULL) {
1195+
return NULL;
1196+
}
1197+
PyErr_Format(state->Error, "Too much data for %s", name);
1198+
return NULL;
1199+
}
11841200

11851201
PyBytesWriter *writer = PyBytesWriter_Create(out_len);
11861202
if (writer == NULL) {
@@ -1272,7 +1288,8 @@ binascii_b2a_base85_impl(PyObject *module, Py_buffer *data, int pad,
12721288
int newline)
12731289
/*[clinic end generated code: output=56936eb231e15dc0 input=3899d4f5c3a589a0]*/
12741290
{
1275-
return internal_b2a_base85(module, data, pad, newline, table_b2a_base85);
1291+
return internal_b2a_base85(module, data, pad, newline,
1292+
table_b2a_base85, "Base85");
12761293
}
12771294

12781295
/*[clinic input]
@@ -1316,7 +1333,7 @@ binascii_b2a_z85_impl(PyObject *module, Py_buffer *data, int pad,
13161333
/*[clinic end generated code: output=a61636b3f618fc1d input=f71c473209eb8f41]*/
13171334
{
13181335
return internal_b2a_base85(module, data, pad, newline,
1319-
table_b2a_base85_z85);
1336+
table_b2a_base85_z85, "Z85");
13201337
}
13211338

13221339
/*[clinic input]

Modules/clinic/binascii.c.h

Lines changed: 5 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)