@@ -652,6 +652,9 @@ array_concat(arrayobject *a, PyObject *bb)
652652 PyErr_BadArgument ();
653653 return NULL ;
654654 }
655+ if (Py_SIZE (a ) > PY_SSIZE_T_MAX - Py_SIZE (b )) {
656+ return PyErr_NoMemory ();
657+ }
655658 size = Py_SIZE (a ) + Py_SIZE (b );
656659 np = (arrayobject * ) newarrayobject (& Arraytype , size , a -> ob_descr );
657660 if (np == NULL ) {
@@ -674,6 +677,9 @@ array_repeat(arrayobject *a, Py_ssize_t n)
674677 Py_ssize_t nbytes ;
675678 if (n < 0 )
676679 n = 0 ;
680+ if ((Py_SIZE (a ) != 0 ) && (n > PY_SSIZE_T_MAX / Py_SIZE (a ))) {
681+ return PyErr_NoMemory ();
682+ }
677683 size = Py_SIZE (a ) * n ;
678684 np = (arrayobject * ) newarrayobject (& Arraytype , size , a -> ob_descr );
679685 if (np == NULL )
@@ -818,6 +824,11 @@ array_do_extend(arrayobject *self, PyObject *bb)
818824 "can only extend with array of same kind" );
819825 return -1 ;
820826 }
827+ if ((Py_SIZE (self ) > PY_SSIZE_T_MAX - Py_SIZE (b )) ||
828+ ((Py_SIZE (self ) + Py_SIZE (b )) > PY_SSIZE_T_MAX / self -> ob_descr -> itemsize )) {
829+ PyErr_NoMemory ();
830+ return -1 ;
831+ }
821832 size = Py_SIZE (self ) + Py_SIZE (b );
822833 PyMem_RESIZE (self -> ob_item , char , size * self -> ob_descr -> itemsize );
823834 if (self -> ob_item == NULL ) {
@@ -859,6 +870,10 @@ array_inplace_repeat(arrayobject *self, Py_ssize_t n)
859870 if (n < 0 )
860871 n = 0 ;
861872 items = self -> ob_item ;
873+ if ((self -> ob_descr -> itemsize != 0 ) &&
874+ (Py_SIZE (self ) > PY_SSIZE_T_MAX / self -> ob_descr -> itemsize )) {
875+ return PyErr_NoMemory ();
876+ }
862877 size = Py_SIZE (self ) * self -> ob_descr -> itemsize ;
863878 if (n == 0 ) {
864879 PyMem_FREE (items );
@@ -867,6 +882,9 @@ array_inplace_repeat(arrayobject *self, Py_ssize_t n)
867882 self -> allocated = 0 ;
868883 }
869884 else {
885+ if (size > PY_SSIZE_T_MAX / n ) {
886+ return PyErr_NoMemory ();
887+ }
870888 PyMem_Resize (items , char , n * size );
871889 if (items == NULL )
872890 return PyErr_NoMemory ();
@@ -1148,6 +1166,10 @@ array_reduce(arrayobject *array)
11481166 Py_INCREF (dict );
11491167 }
11501168 if (Py_SIZE (array ) > 0 ) {
1169+ if (array -> ob_descr -> itemsize
1170+ > PY_SSIZE_T_MAX / array -> ob_size ) {
1171+ return PyErr_NoMemory ();
1172+ }
11511173 result = Py_BuildValue ("O(cs#)O" ,
11521174 Py_TYPE (array ),
11531175 array -> ob_descr -> typecode ,
@@ -1330,6 +1352,9 @@ array_fromlist(arrayobject *self, PyObject *list)
13301352 if ((* self -> ob_descr -> setitem )(self ,
13311353 Py_SIZE (self ) - n + i , v ) != 0 ) {
13321354 Py_SIZE (self ) -= n ;
1355+ if (itemsize && (self -> ob_size > PY_SSIZE_T_MAX / itemsize )) {
1356+ return PyErr_NoMemory ();
1357+ }
13331358 PyMem_RESIZE (item , char ,
13341359 Py_SIZE (self ) * itemsize );
13351360 self -> ob_item = item ;
@@ -1389,6 +1414,10 @@ array_fromstring(arrayobject *self, PyObject *args)
13891414 n = n / itemsize ;
13901415 if (n > 0 ) {
13911416 char * item = self -> ob_item ;
1417+ if ((n > PY_SSIZE_T_MAX - Py_SIZE (self )) ||
1418+ ((Py_SIZE (self ) + n ) > PY_SSIZE_T_MAX / itemsize )) {
1419+ return PyErr_NoMemory ();
1420+ }
13921421 PyMem_RESIZE (item , char , (Py_SIZE (self ) + n ) * itemsize );
13931422 if (item == NULL ) {
13941423 PyErr_NoMemory ();
@@ -1414,8 +1443,12 @@ values,as if it had been read from a file using the fromfile() method).");
14141443static PyObject *
14151444array_tostring (arrayobject * self , PyObject * unused )
14161445{
1417- return PyString_FromStringAndSize (self -> ob_item ,
1446+ if (self -> ob_size <= PY_SSIZE_T_MAX / self -> ob_descr -> itemsize ) {
1447+ return PyString_FromStringAndSize (self -> ob_item ,
14181448 Py_SIZE (self ) * self -> ob_descr -> itemsize );
1449+ } else {
1450+ return PyErr_NoMemory ();
1451+ }
14191452}
14201453
14211454PyDoc_STRVAR (tostring_doc ,
@@ -1443,6 +1476,9 @@ array_fromunicode(arrayobject *self, PyObject *args)
14431476 }
14441477 if (n > 0 ) {
14451478 Py_UNICODE * item = (Py_UNICODE * ) self -> ob_item ;
1479+ if (Py_SIZE (self ) > PY_SSIZE_T_MAX - n ) {
1480+ return PyErr_NoMemory ();
1481+ }
14461482 PyMem_RESIZE (item , Py_UNICODE , Py_SIZE (self ) + n );
14471483 if (item == NULL ) {
14481484 PyErr_NoMemory ();
0 commit comments