A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/python/cpython/commit/4b42d575bf0fb01192b3ec54b7e224b238691527 below:

Avoid relying on signed overflow in _pickle memos (G… · python/cpython@4b42d57 · GitHub

@@ -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