A RetroSearch Logo

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

Search Query:

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

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

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

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

650 650

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

651 651

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

652 652

PyObject **memo;

653 -

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

654 -

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

653 +

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

654 +

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

655 655 656 656

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

657 657

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

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

@@ -821,22 +820,24 @@ _PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)

821 820 822 821

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

823 822

static int

824 -

_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)

823 +

_PyMemoTable_ResizeTable(PyMemoTable *self, size_t min_size)

825 824

{

826 825

PyMemoEntry *oldtable = NULL;

827 826

PyMemoEntry *oldentry, *newentry;

828 -

Py_ssize_t new_size = MT_MINSIZE;

829 -

Py_ssize_t to_process;

827 +

size_t new_size = MT_MINSIZE;

828 +

size_t to_process;

830 829 831 830

assert(min_size > 0);

832 831 833 -

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

834 -

while (new_size < min_size && new_size > 0)

835 -

new_size <<= 1;

836 -

if (new_size <= 0) {

832 +

if (min_size > PY_SSIZE_T_MAX) {

837 833

PyErr_NoMemory();

838 834

return -1;

839 835

}

836 + 837 +

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

838 +

while (new_size < min_size) {

839 +

new_size <<= 1;

840 +

}

840 841

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

841 842

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

842 843

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

909 910

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

910 911

* This may help applications with severe memory constraints.

911 912

*/

912 -

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

913 +

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

913 914

return 0;

914 -

return _PyMemoTable_ResizeTable(self,

915 -

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

915 +

}

916 +

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

917 +

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

918 +

return _PyMemoTable_ResizeTable(self, desired_size);

916 919

}

917 920 918 921

#undef MT_MINSIZE

@@ -1376,9 +1379,9 @@ _Unpickler_Readline(UnpicklerObject *self, char **result)

1376 1379

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

1377 1380

will be modified in place. */

1378 1381

static int

1379 -

_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)

1382 +

_Unpickler_ResizeMemoList(UnpicklerObject *self, size_t new_size)

1380 1383

{

1381 -

Py_ssize_t i;

1384 +

size_t i;

1382 1385 1383 1386

assert(new_size > self->memo_size);

1384 1387

@@ -1397,9 +1400,9 @@ _Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)

1397 1400 1398 1401

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

1399 1402

static PyObject *

1400 -

_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)

1403 +

_Unpickler_MemoGet(UnpicklerObject *self, size_t idx)

1401 1404

{

1402 -

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

1405 +

if (idx >= self->memo_size)

1403 1406

return NULL;

1404 1407 1405 1408

return self->memo[idx];

@@ -1408,7 +1411,7 @@ _Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)

1408 1411

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

1409 1412

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

1410 1413

static int

1411 -

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

1414 +

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

1412 1415

{

1413 1416

PyObject *old_item;

1414 1417

@@ -4413,14 +4416,13 @@ static PyObject *

4413 4416

_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)

4414 4417

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

4415 4418

{

4416 -

Py_ssize_t i;

4417 4419

PyMemoTable *memo;

4418 4420

PyObject *new_memo = PyDict_New();

4419 4421

if (new_memo == NULL)

4420 4422

return NULL;

4421 4423 4422 4424

memo = self->pickler->memo;

4423 -

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

4425 +

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

4424 4426

PyMemoEntry entry = memo->mt_table[i];

4425 4427

if (entry.me_key != NULL) {

4426 4428

int status;

@@ -6843,7 +6845,7 @@ static PyObject *

6843 6845

_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)

6844 6846

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

6845 6847

{

6846 -

Py_ssize_t i;

6848 +

size_t i;

6847 6849

PyObject *new_memo = PyDict_New();

6848 6850

if (new_memo == NULL)

6849 6851

return NULL;

@@ -6994,8 +6996,7 @@ static int

6994 6996

Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)

6995 6997

{

6996 6998

PyObject **new_memo;

6997 -

Py_ssize_t new_memo_size = 0;

6998 -

Py_ssize_t i;

6999 +

size_t new_memo_size = 0;

6999 7000 7000 7001

if (obj == NULL) {

7001 7002

PyErr_SetString(PyExc_TypeError,

@@ -7012,7 +7013,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)

7012 7013

if (new_memo == NULL)

7013 7014

return -1;

7014 7015 7015 -

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

7016 +

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

7016 7017

Py_XINCREF(unpickler->memo[i]);

7017 7018

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

7018 7019

}

@@ -7060,8 +7061,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)

7060 7061 7061 7062

error:

7062 7063

if (new_memo_size) {

7063 -

i = new_memo_size;

7064 -

while (--i >= 0) {

7064 +

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

7065 7065

Py_XDECREF(new_memo[i]);

7066 7066

}

7067 7067

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