@@ -602,9 +602,9 @@ typedef struct {
602602} PyMemoEntry ;
603603
604604typedef struct {
605- Py_ssize_t mt_mask ;
606- Py_ssize_t mt_used ;
607- Py_ssize_t mt_allocated ;
605+ size_t mt_mask ;
606+ size_t mt_used ;
607+ size_t mt_allocated ;
608608 PyMemoEntry * mt_table ;
609609} PyMemoTable ;
610610
@@ -737,7 +737,6 @@ PyMemoTable_New(void)
737737static PyMemoTable *
738738PyMemoTable_Copy (PyMemoTable * self )
739739{
740- Py_ssize_t i ;
741740 PyMemoTable * new = PyMemoTable_New ();
742741 if (new == NULL )
743742 return NULL ;
@@ -754,7 +753,7 @@ PyMemoTable_Copy(PyMemoTable *self)
754753 PyErr_NoMemory ();
755754 return NULL ;
756755 }
757- for (i = 0 ; i < self -> mt_allocated ; i ++ ) {
756+ for (size_t i = 0 ; i < self -> mt_allocated ; i ++ ) {
758757 Py_XINCREF (self -> mt_table [i ].me_key );
759758 }
760759 memcpy (new -> mt_table , self -> mt_table ,
@@ -800,7 +799,7 @@ _PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
800799{
801800 size_t i ;
802801 size_t perturb ;
803- size_t mask = ( size_t ) self -> mt_mask ;
802+ size_t mask = self -> mt_mask ;
804803 PyMemoEntry * table = self -> mt_table ;
805804 PyMemoEntry * entry ;
806805 Py_hash_t hash = (Py_hash_t )key >> 3 ;
@@ -826,10 +825,15 @@ _PyMemoTable_ResizeTable(PyMemoTable *self, size_t min_size)
826825 PyMemoEntry * oldtable = NULL ;
827826 PyMemoEntry * oldentry , * newentry ;
828827 size_t new_size = MT_MINSIZE ;
829- Py_ssize_t to_process ;
828+ size_t to_process ;
830829
831830 assert (min_size > 0 );
832831
832+ if (min_size > PY_SSIZE_T_MAX ) {
833+ PyErr_NoMemory ();
834+ return -1 ;
835+ }
836+
833837 /* Find the smallest valid table size >= min_size. */
834838 while (new_size < min_size )
835839 new_size <<= 1 ;
@@ -905,7 +909,8 @@ PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
905909 * Very large memo tables (over 50K items) use doubling instead.
906910 * This may help applications with severe memory constraints.
907911 */
908- if (!(self -> mt_used * 3 >= (self -> mt_mask + 1 ) * 2 ))
912+ size_t triple_used = self -> mt_used * 3 ;
913+ if (triple_used > self -> mt_used && triple_used < self -> mt_allocated * 2 )
909914 return 0 ;
910915 return _PyMemoTable_ResizeTable (self ,
911916 (self -> mt_used > 50000 ? 2 : 4 ) * self -> mt_used );
@@ -4409,14 +4414,13 @@ static PyObject *
44094414_pickle_PicklerMemoProxy_copy_impl (PicklerMemoProxyObject * self )
44104415/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
44114416{
4412- Py_ssize_t i ;
44134417 PyMemoTable * memo ;
44144418 PyObject * new_memo = PyDict_New ();
44154419 if (new_memo == NULL )
44164420 return NULL ;
44174421
44184422 memo = self -> pickler -> memo ;
4419- for (i = 0 ; i < memo -> mt_allocated ; ++ i ) {
4423+ for (size_t i = 0 ; i < memo -> mt_allocated ; ++ i ) {
44204424 PyMemoEntry entry = memo -> mt_table [i ];
44214425 if (entry .me_key != NULL ) {
44224426 int status ;
0 commit comments