Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ff0f322

Browse files
committed
merge 3.3
2 parents 89584c9 + 59b08c1 commit ff0f322

2 files changed

Lines changed: 12 additions & 16 deletions

File tree

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ Library
9191
- Issue #23796: peek and read1 methods of BufferedReader now raise ValueError
9292
if they called on a closed object. Patch by John Hergenroeder.
9393

94+
- Fix possible integer overflows in the pickle module.
95+
9496
- Issue #22931: Allow '[' and ']' in cookie values.
9597

9698
- Issue #20274: Remove ignored and erroneous "kwargs" parameters from three

Modules/_pickle.c

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -428,9 +428,7 @@ Pdata_grow(Pdata *self)
428428
if (new_allocated > PY_SSIZE_T_MAX - allocated)
429429
goto nomemory;
430430
new_allocated += allocated;
431-
if (new_allocated > (PY_SSIZE_T_MAX / sizeof(PyObject *)))
432-
goto nomemory;
433-
data = PyMem_REALLOC(data, new_allocated * sizeof(PyObject *));
431+
PyMem_RESIZE(data, PyObject *, new_allocated);
434432
if (data == NULL)
435433
goto nomemory;
436434

@@ -660,7 +658,7 @@ PyMemoTable_Copy(PyMemoTable *self)
660658
/* The table we get from _New() is probably smaller than we wanted.
661659
Free it and allocate one that's the right size. */
662660
PyMem_FREE(new->mt_table);
663-
new->mt_table = PyMem_MALLOC(self->mt_allocated * sizeof(PyMemoEntry));
661+
new->mt_table = PyMem_NEW(PyMemoEntry, self->mt_allocated);
664662
if (new->mt_table == NULL) {
665663
PyMem_FREE(new);
666664
PyErr_NoMemory();
@@ -755,7 +753,7 @@ _PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
755753

756754
/* Allocate new table. */
757755
oldtable = self->mt_table;
758-
self->mt_table = PyMem_MALLOC(new_size * sizeof(PyMemoEntry));
756+
self->mt_table = PyMem_NEW(PyMemoEntry, new_size);
759757
if (self->mt_table == NULL) {
760758
self->mt_table = oldtable;
761759
PyErr_NoMemory();
@@ -1261,16 +1259,14 @@ static int
12611259
_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
12621260
{
12631261
Py_ssize_t i;
1264-
PyObject **memo;
12651262

12661263
assert(new_size > self->memo_size);
12671264

1268-
memo = PyMem_REALLOC(self->memo, new_size * sizeof(PyObject *));
1269-
if (memo == NULL) {
1265+
PyMem_RESIZE(self->memo, PyObject *, new_size);
1266+
if (self->memo == NULL) {
12701267
PyErr_NoMemory();
12711268
return -1;
12721269
}
1273-
self->memo = memo;
12741270
for (i = self->memo_size; i < new_size; i++)
12751271
self->memo[i] = NULL;
12761272
self->memo_size = new_size;
@@ -1314,7 +1310,7 @@ _Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
13141310
static PyObject **
13151311
_Unpickler_NewMemo(Py_ssize_t new_size)
13161312
{
1317-
PyObject **memo = PyMem_MALLOC(new_size * sizeof(PyObject *));
1313+
PyObject **memo = PyMem_NEW(PyObject *, new_size);
13181314
if (memo == NULL) {
13191315
PyErr_NoMemory();
13201316
return NULL;
@@ -5963,7 +5959,6 @@ load_mark(UnpicklerObject *self)
59635959

59645960
if ((self->num_marks + 1) >= self->marks_size) {
59655961
size_t alloc;
5966-
Py_ssize_t *marks;
59675962

59685963
/* Use the size_t type to check for overflow. */
59695964
alloc = ((size_t)self->num_marks << 1) + 20;
@@ -5974,15 +5969,14 @@ load_mark(UnpicklerObject *self)
59745969
}
59755970

59765971
if (self->marks == NULL)
5977-
marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t));
5972+
self->marks = PyMem_NEW(Py_ssize_t, alloc);
59785973
else
5979-
marks = (Py_ssize_t *) PyMem_Realloc(self->marks,
5980-
alloc * sizeof(Py_ssize_t));
5981-
if (marks == NULL) {
5974+
PyMem_RESIZE(self->marks, Py_ssize_t, alloc);
5975+
if (self->marks == NULL) {
5976+
self->marks_size = 0;
59825977
PyErr_NoMemory();
59835978
return -1;
59845979
}
5985-
self->marks = marks;
59865980
self->marks_size = (Py_ssize_t)alloc;
59875981
}
59885982

0 commit comments

Comments
 (0)