@@ -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
985985static PyObject *
986986binascii_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
11671175static PyObject *
11681176internal_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]
0 commit comments