@@ -602,9 +602,9 @@ typedef struct {
602
602
} PyMemoEntry ;
603
603
604
604
typedef 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 ;
608
608
PyMemoEntry * mt_table ;
609
609
} PyMemoTable ;
610
610
@@ -737,7 +737,6 @@ PyMemoTable_New(void)
737
737
static PyMemoTable *
738
738
PyMemoTable_Copy (PyMemoTable * self )
739
739
{
740
- Py_ssize_t i ;
741
740
PyMemoTable * new = PyMemoTable_New ();
742
741
if (new == NULL )
743
742
return NULL ;
@@ -754,7 +753,7 @@ PyMemoTable_Copy(PyMemoTable *self)
754
753
PyErr_NoMemory ();
755
754
return NULL ;
756
755
}
757
- for (i = 0 ; i < self -> mt_allocated ; i ++ ) {
756
+ for (size_t i = 0 ; i < self -> mt_allocated ; i ++ ) {
758
757
Py_XINCREF (self -> mt_table [i ].me_key );
759
758
}
760
759
memcpy (new -> mt_table , self -> mt_table ,
@@ -800,7 +799,7 @@ _PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
800
799
{
801
800
size_t i ;
802
801
size_t perturb ;
803
- size_t mask = ( size_t ) self -> mt_mask ;
802
+ size_t mask = self -> mt_mask ;
804
803
PyMemoEntry * table = self -> mt_table ;
805
804
PyMemoEntry * entry ;
806
805
Py_hash_t hash = (Py_hash_t )key >> 3 ;
@@ -826,10 +825,15 @@ _PyMemoTable_ResizeTable(PyMemoTable *self, size_t min_size)
826
825
PyMemoEntry * oldtable = NULL ;
827
826
PyMemoEntry * oldentry , * newentry ;
828
827
size_t new_size = MT_MINSIZE ;
829
- Py_ssize_t to_process ;
828
+ size_t to_process ;
830
829
831
830
assert (min_size > 0 );
832
831
832
+ if (min_size > PY_SSIZE_T_MAX ) {
833
+ PyErr_NoMemory ();
834
+ return -1 ;
835
+ }
836
+
833
837
/* Find the smallest valid table size >= min_size. */
834
838
while (new_size < min_size )
835
839
new_size <<= 1 ;
@@ -905,7 +909,8 @@ PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
905
909
* Very large memo tables (over 50K items) use doubling instead.
906
910
* This may help applications with severe memory constraints.
907
911
*/
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 )
909
914
return 0 ;
910
915
return _PyMemoTable_ResizeTable (self ,
911
916
(self -> mt_used > 50000 ? 2 : 4 ) * self -> mt_used );
@@ -4409,14 +4414,13 @@ static PyObject *
4409
4414
_pickle_PicklerMemoProxy_copy_impl (PicklerMemoProxyObject * self )
4410
4415
/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
4411
4416
{
4412
- Py_ssize_t i ;
4413
4417
PyMemoTable * memo ;
4414
4418
PyObject * new_memo = PyDict_New ();
4415
4419
if (new_memo == NULL )
4416
4420
return NULL ;
4417
4421
4418
4422
memo = self -> pickler -> memo ;
4419
- for (i = 0 ; i < memo -> mt_allocated ; ++ i ) {
4423
+ for (size_t i = 0 ; i < memo -> mt_allocated ; ++ i ) {
4420
4424
PyMemoEntry entry = memo -> mt_table [i ];
4421
4425
if (entry .me_key != NULL ) {
4422
4426
int status ;
0 commit comments