@@ -516,9 +516,9 @@ typedef struct {
516
516
} PyMemoEntry;
517
517
518
518
typedef struct {
519
-
Py_ssize_t mt_mask;
520
-
Py_ssize_t mt_used;
521
-
Py_ssize_t mt_allocated;
519
+
size_t mt_mask;
520
+
size_t mt_used;
521
+
size_t mt_allocated;
522
522
PyMemoEntry *mt_table;
523
523
} PyMemoTable;
524
524
@@ -562,8 +562,8 @@ typedef struct UnpicklerObject {
562
562
/* The unpickler memo is just an array of PyObject *s. Using a dict
563
563
is unnecessary, since the keys are contiguous ints. */
564
564
PyObject **memo;
565
-
Py_ssize_t memo_size; /* Capacity of the memo array */
566
-
Py_ssize_t memo_len; /* Number of objects in the memo */
565
+
size_t memo_size; /* Capacity of the memo array */
566
+
size_t memo_len; /* Number of objects in the memo */
567
567
568
568
PyObject *pers_func; /* persistent_load() method, can be NULL. */
569
569
@@ -647,7 +647,7 @@ PyMemoTable_New(void)
647
647
static PyMemoTable *
648
648
PyMemoTable_Copy(PyMemoTable *self)
649
649
{
650
-
Py_ssize_t i;
650
+
size_t i;
651
651
PyMemoTable *new = PyMemoTable_New();
652
652
if (new == NULL)
653
653
return NULL;
@@ -710,7 +710,7 @@ _PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
710
710
{
711
711
size_t i;
712
712
size_t perturb;
713
-
size_t mask = (size_t)self->mt_mask;
713
+
size_t mask = self->mt_mask;
714
714
PyMemoEntry *table = self->mt_table;
715
715
PyMemoEntry *entry;
716
716
Py_hash_t hash = (Py_hash_t)key >> 3;
@@ -732,22 +732,24 @@ _PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
732
732
733
733
/* Returns -1 on failure, 0 on success. */
734
734
static int
735
-
_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
735
+
_PyMemoTable_ResizeTable(PyMemoTable *self, size_t min_size)
736
736
{
737
737
PyMemoEntry *oldtable = NULL;
738
738
PyMemoEntry *oldentry, *newentry;
739
-
Py_ssize_t new_size = MT_MINSIZE;
740
-
Py_ssize_t to_process;
739
+
size_t new_size = MT_MINSIZE;
740
+
size_t to_process;
741
741
742
742
assert(min_size > 0);
743
743
744
-
/* Find the smallest valid table size >= min_size. */
745
-
while (new_size < min_size && new_size > 0)
746
-
new_size <<= 1;
747
-
if (new_size <= 0) {
744
+
if (min_size > PY_SSIZE_T_MAX) {
748
745
PyErr_NoMemory();
749
746
return -1;
750
747
}
748
+
749
+
/* Find the smallest valid table size >= min_size. */
750
+
while (new_size < min_size) {
751
+
new_size <<= 1;
752
+
}
751
753
/* new_size needs to be a power of two. */
752
754
assert((new_size & (new_size - 1)) == 0);
753
755
@@ -797,6 +799,7 @@ static int
797
799
PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
798
800
{
799
801
PyMemoEntry *entry;
802
+
size_t desired_size;
800
803
801
804
assert(key != NULL);
802
805
@@ -820,10 +823,12 @@ PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
820
823
* Very large memo tables (over 50K items) use doubling instead.
821
824
* This may help applications with severe memory constraints.
822
825
*/
823
-
if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2))
826
+
if (SIZE_MAX / 3 >= self->mt_used && self->mt_used * 3 < self->mt_allocated * 2) {
824
827
return 0;
825
-
return _PyMemoTable_ResizeTable(self,
826
-
(self->mt_used > 50000 ? 2 : 4) * self->mt_used);
828
+
}
829
+
// self->mt_used is always < PY_SSIZE_T_MAX, so this can't overflow.
830
+
desired_size = (self->mt_used > 50000 ? 2 : 4) * self->mt_used;
831
+
return _PyMemoTable_ResizeTable(self, desired_size);
827
832
}
828
833
829
834
#undef MT_MINSIZE
@@ -1263,9 +1268,9 @@ _Unpickler_Readline(UnpicklerObject *self, char **result)
1263
1268
/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1264
1269
will be modified in place. */
1265
1270
static int
1266
-
_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1271
+
_Unpickler_ResizeMemoList(UnpicklerObject *self, size_t new_size)
1267
1272
{
1268
-
Py_ssize_t i;
1273
+
size_t i;
1269
1274
1270
1275
assert(new_size > self->memo_size);
1271
1276
@@ -1282,9 +1287,9 @@ _Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1282
1287
1283
1288
/* Returns NULL if idx is out of bounds. */
1284
1289
static PyObject *
1285
-
_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1290
+
_Unpickler_MemoGet(UnpicklerObject *self, size_t idx)
1286
1291
{
1287
-
if (idx < 0 || idx >= self->memo_size)
1292
+
if (idx >= self->memo_size)
1288
1293
return NULL;
1289
1294
1290
1295
return self->memo[idx];
@@ -1293,7 +1298,7 @@ _Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1293
1298
/* Returns -1 (with an exception set) on failure, 0 on success.
1294
1299
This takes its own reference to `value`. */
1295
1300
static int
1296
-
_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
1301
+
_Unpickler_MemoPut(UnpicklerObject *self, size_t idx, PyObject *value)
1297
1302
{
1298
1303
PyObject *old_item;
1299
1304
@@ -4129,7 +4134,7 @@ static PyObject *
4129
4134
_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
4130
4135
/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
4131
4136
{
4132
-
Py_ssize_t i;
4137
+
size_t i;
4133
4138
PyMemoTable *memo;
4134
4139
PyObject *new_memo = PyDict_New();
4135
4140
if (new_memo == NULL)
@@ -6545,7 +6550,7 @@ static PyObject *
6545
6550
_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
6546
6551
/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
6547
6552
{
6548
-
Py_ssize_t i;
6553
+
size_t i;
6549
6554
PyObject *new_memo = PyDict_New();
6550
6555
if (new_memo == NULL)
6551
6556
return NULL;
@@ -6696,8 +6701,7 @@ static int
6696
6701
Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
6697
6702
{
6698
6703
PyObject **new_memo;
6699
-
Py_ssize_t new_memo_size = 0;
6700
-
Py_ssize_t i;
6704
+
size_t new_memo_size = 0;
6701
6705
6702
6706
if (obj == NULL) {
6703
6707
PyErr_SetString(PyExc_TypeError,
@@ -6706,6 +6710,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
6706
6710
}
6707
6711
6708
6712
if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6713
+
size_t i;
6709
6714
UnpicklerObject *unpickler =
6710
6715
((UnpicklerMemoProxyObject *)obj)->unpickler;
6711
6716
@@ -6762,8 +6767,8 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
6762
6767
6763
6768
error:
6764
6769
if (new_memo_size) {
6765
-
i = new_memo_size;
6766
-
while (--i >= 0) {
6770
+
size_t i;
6771
+
for (i = new_memo_size - 1; i != SIZE_MAX; i--) {
6767
6772
Py_XDECREF(new_memo[i]);
6768
6773
}
6769
6774
PyMem_FREE(new_memo);
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4