A RetroSearch Logo

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

Search Query:

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

Avoid relying on signed overflow in _pickle memos. … · python/cpython@ef4306b · GitHub

@@ -600,9 +600,9 @@ typedef struct {

600 600

} PyMemoEntry;

601 601 602 602

typedef struct {

603 -

Py_ssize_t mt_mask;

604 -

Py_ssize_t mt_used;

605 -

Py_ssize_t mt_allocated;

603 +

size_t mt_mask;

604 +

size_t mt_used;

605 +

size_t mt_allocated;

606 606

PyMemoEntry *mt_table;

607 607

} PyMemoTable;

608 608

@@ -648,8 +648,8 @@ typedef struct UnpicklerObject {

648 648

/* The unpickler memo is just an array of PyObject *s. Using a dict

649 649

is unnecessary, since the keys are contiguous ints. */

650 650

PyObject **memo;

651 -

Py_ssize_t memo_size; /* Capacity of the memo array */

652 -

Py_ssize_t memo_len; /* Number of objects in the memo */

651 +

size_t memo_size; /* Capacity of the memo array */

652 +

size_t memo_len; /* Number of objects in the memo */

653 653 654 654

PyObject *pers_func; /* persistent_load() method, can be NULL. */

655 655

PyObject *pers_func_self; /* borrowed reference to self if pers_func

@@ -735,7 +735,6 @@ PyMemoTable_New(void)

735 735

static PyMemoTable *

736 736

PyMemoTable_Copy(PyMemoTable *self)

737 737

{

738 -

Py_ssize_t i;

739 738

PyMemoTable *new = PyMemoTable_New();

740 739

if (new == NULL)

741 740

return NULL;

@@ -752,7 +751,7 @@ PyMemoTable_Copy(PyMemoTable *self)

752 751

PyErr_NoMemory();

753 752

return NULL;

754 753

}

755 -

for (i = 0; i < self->mt_allocated; i++) {

754 +

for (size_t i = 0; i < self->mt_allocated; i++) {

756 755

Py_XINCREF(self->mt_table[i].me_key);

757 756

}

758 757

memcpy(new->mt_table, self->mt_table,

@@ -798,7 +797,7 @@ _PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)

798 797

{

799 798

size_t i;

800 799

size_t perturb;

801 -

size_t mask = (size_t)self->mt_mask;

800 +

size_t mask = self->mt_mask;

802 801

PyMemoEntry *table = self->mt_table;

803 802

PyMemoEntry *entry;

804 803

Py_hash_t hash = (Py_hash_t)key >> 3;

@@ -819,22 +818,24 @@ _PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)

819 818 820 819

/* Returns -1 on failure, 0 on success. */

821 820

static int

822 -

_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)

821 +

_PyMemoTable_ResizeTable(PyMemoTable *self, size_t min_size)

823 822

{

824 823

PyMemoEntry *oldtable = NULL;

825 824

PyMemoEntry *oldentry, *newentry;

826 -

Py_ssize_t new_size = MT_MINSIZE;

827 -

Py_ssize_t to_process;

825 +

size_t new_size = MT_MINSIZE;

826 +

size_t to_process;

828 827 829 828

assert(min_size > 0);

830 829 831 -

/* Find the smallest valid table size >= min_size. */

832 -

while (new_size < min_size && new_size > 0)

833 -

new_size <<= 1;

834 -

if (new_size <= 0) {

830 +

if (min_size > PY_SSIZE_T_MAX) {

835 831

PyErr_NoMemory();

836 832

return -1;

837 833

}

834 + 835 +

/* Find the smallest valid table size >= min_size. */

836 +

while (new_size < min_size) {

837 +

new_size <<= 1;

838 +

}

838 839

/* new_size needs to be a power of two. */

839 840

assert((new_size & (new_size - 1)) == 0);

840 841

@@ -907,10 +908,12 @@ PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)

907 908

* Very large memo tables (over 50K items) use doubling instead.

908 909

* This may help applications with severe memory constraints.

909 910

*/

910 -

if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2))

911 +

if (SIZE_MAX / 3 >= self->mt_used && self->mt_used * 3 < self->mt_allocated * 2) {

911 912

return 0;

912 -

return _PyMemoTable_ResizeTable(self,

913 -

(self->mt_used > 50000 ? 2 : 4) * self->mt_used);

913 +

}

914 +

// self->mt_used is always < PY_SSIZE_T_MAX, so this can't overflow.

915 +

size_t desired_size = (self->mt_used > 50000 ? 2 : 4) * self->mt_used;

916 +

return _PyMemoTable_ResizeTable(self, desired_size);

914 917

}

915 918 916 919

#undef MT_MINSIZE

@@ -1374,9 +1377,9 @@ _Unpickler_Readline(UnpicklerObject *self, char **result)

1374 1377

/* Returns -1 (with an exception set) on failure, 0 on success. The memo array

1375 1378

will be modified in place. */

1376 1379

static int

1377 -

_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)

1380 +

_Unpickler_ResizeMemoList(UnpicklerObject *self, size_t new_size)

1378 1381

{

1379 -

Py_ssize_t i;

1382 +

size_t i;

1380 1383 1381 1384

assert(new_size > self->memo_size);

1382 1385

@@ -1395,9 +1398,9 @@ _Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)

1395 1398 1396 1399

/* Returns NULL if idx is out of bounds. */

1397 1400

static PyObject *

1398 -

_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)

1401 +

_Unpickler_MemoGet(UnpicklerObject *self, size_t idx)

1399 1402

{

1400 -

if (idx < 0 || idx >= self->memo_size)

1403 +

if (idx >= self->memo_size)

1401 1404

return NULL;

1402 1405 1403 1406

return self->memo[idx];

@@ -1406,7 +1409,7 @@ _Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)

1406 1409

/* Returns -1 (with an exception set) on failure, 0 on success.

1407 1410

This takes its own reference to `value`. */

1408 1411

static int

1409 -

_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)

1412 +

_Unpickler_MemoPut(UnpicklerObject *self, size_t idx, PyObject *value)

1410 1413

{

1411 1414

PyObject *old_item;

1412 1415

@@ -4415,14 +4418,13 @@ static PyObject *

4415 4418

_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)

4416 4419

/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/

4417 4420

{

4418 -

Py_ssize_t i;

4419 4421

PyMemoTable *memo;

4420 4422

PyObject *new_memo = PyDict_New();

4421 4423

if (new_memo == NULL)

4422 4424

return NULL;

4423 4425 4424 4426

memo = self->pickler->memo;

4425 -

for (i = 0; i < memo->mt_allocated; ++i) {

4427 +

for (size_t i = 0; i < memo->mt_allocated; ++i) {

4426 4428

PyMemoEntry entry = memo->mt_table[i];

4427 4429

if (entry.me_key != NULL) {

4428 4430

int status;

@@ -6855,7 +6857,7 @@ static PyObject *

6855 6857

_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)

6856 6858

/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/

6857 6859

{

6858 -

Py_ssize_t i;

6860 +

size_t i;

6859 6861

PyObject *new_memo = PyDict_New();

6860 6862

if (new_memo == NULL)

6861 6863

return NULL;

@@ -7006,8 +7008,7 @@ static int

7006 7008

Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)

7007 7009

{

7008 7010

PyObject **new_memo;

7009 -

Py_ssize_t new_memo_size = 0;

7010 -

Py_ssize_t i;

7011 +

size_t new_memo_size = 0;

7011 7012 7012 7013

if (obj == NULL) {

7013 7014

PyErr_SetString(PyExc_TypeError,

@@ -7024,7 +7025,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)

7024 7025

if (new_memo == NULL)

7025 7026

return -1;

7026 7027 7027 -

for (i = 0; i < new_memo_size; i++) {

7028 +

for (size_t i = 0; i < new_memo_size; i++) {

7028 7029

Py_XINCREF(unpickler->memo[i]);

7029 7030

new_memo[i] = unpickler->memo[i];

7030 7031

}

@@ -7072,8 +7073,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)

7072 7073 7073 7074

error:

7074 7075

if (new_memo_size) {

7075 -

i = new_memo_size;

7076 -

while (--i >= 0) {

7076 +

for (size_t i = new_memo_size - 1; i != SIZE_MAX; i--) {

7077 7077

Py_XDECREF(new_memo[i]);

7078 7078

}

7079 7079

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