8000 do more arithmetic in size_t · python/cpython@064164b · GitHub
[go: up one dir, main page]

Skip to content

Commit 064164b

Browse files
committed
do more arithmetic in size_t
1 parent 6353709 commit 064164b

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

Modules/_pickle.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -602,9 +602,9 @@ typedef struct {
602602
} PyMemoEntry;
603603

604604
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;
608608
PyMemoEntry *mt_table;
609609
} PyMemoTable;
610610

@@ -737,7 +737,6 @@ PyMemoTable_New(void)
737737
static PyMemoTable *
738738
PyMemoTable_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

Comments
 (0)
0