Commit 93434890 authored by Raymond Hettinger's avatar Raymond Hettinger

Issue 21375: Fix possible Py_ssizet overflow in heapq.

parent 2460dc88
...@@ -86,7 +86,7 @@ _siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) ...@@ -86,7 +86,7 @@ _siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)
static int static int
_siftup(PyListObject *heap, Py_ssize_t pos) _siftup(PyListObject *heap, Py_ssize_t pos)
{ {
Py_ssize_t startpos, endpos, childpos, rightpos; Py_ssize_t startpos, endpos, childpos, rightpos, limit;
int cmp; int cmp;
PyObject *newitem, *tmp, *olditem; PyObject *newitem, *tmp, *olditem;
Py_ssize_t size; Py_ssize_t size;
...@@ -103,9 +103,10 @@ _siftup(PyListObject *heap, Py_ssize_t pos) ...@@ -103,9 +103,10 @@ _siftup(PyListObject *heap, Py_ssize_t pos)
Py_INCREF(newitem); Py_INCREF(newitem);
/* Bubble up the smaller child until hitting a leaf. */ /* Bubble up the smaller child until hitting a leaf. */
childpos = 2*pos + 1; /* leftmost child position */ limit = endpos / 2; /* smallest pos that has no child */
while (childpos < endpos) { while (pos < limit) {
/* Set childpos to index of smaller child. */ /* Set childpos to index of smaller child. */
childpos = 2*pos + 1; /* leftmost child position */
rightpos = childpos + 1; rightpos = childpos + 1;
if (rightpos < endpos) { if (rightpos < endpos) {
cmp = cmp_lt( cmp = cmp_lt(
...@@ -131,7 +132,6 @@ _siftup(PyListObject *heap, Py_ssize_t pos) ...@@ -131,7 +132,6 @@ _siftup(PyListObject *heap, Py_ssize_t pos)
PyList_SET_ITEM(heap, pos, tmp); PyList_SET_ITEM(heap, pos, tmp);
Py_DECREF(olditem); Py_DECREF(olditem);
pos = childpos; pos = childpos;
childpos = 2*pos + 1;
if (size != PyList_GET_SIZE(heap)) { if (size != PyList_GET_SIZE(heap)) {
PyErr_SetString(PyExc_RuntimeError, PyErr_SetString(PyExc_RuntimeError,
"list changed size during iteration"); "list changed size during iteration");
...@@ -439,7 +439,7 @@ _siftdownmax(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) ...@@ -439,7 +439,7 @@ _siftdownmax(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)
static int static int
_siftupmax(PyListObject *heap, Py_ssize_t pos) _siftupmax(PyListObject *heap, Py_ssize_t pos)
{ {
Py_ssize_t startpos, endpos, childpos, rightpos; Py_ssize_t startpos, endpos, childpos, rightpos, limit;
int cmp; int cmp;
PyObject *newitem, *tmp; PyObject *newitem, *tmp;
...@@ -454,9 +454,10 @@ _siftupmax(PyListObject *heap, Py_ssize_t pos) ...@@ -454,9 +454,10 @@ _siftupmax(PyListObject *heap, Py_ssize_t pos)
Py_INCREF(newitem); Py_INCREF(newitem);
/* Bubble up the smaller child until hitting a leaf. */ /* Bubble up the smaller child until hitting a leaf. */
childpos = 2*pos + 1; /* leftmost child position */ limit = endpos / 2; /* smallest pos that has no child */
while (childpos < endpos) { while (pos < limit) {
/* Set childpos to index of smaller child. */ /* Set childpos to index of smaller child. */
childpos = 2*pos + 1; /* leftmost child position */
rightpos = childpos + 1; rightpos = childpos + 1;
if (rightpos < endpos) { if (rightpos < endpos) {
cmp = cmp_lt( cmp = cmp_lt(
...@@ -475,7 +476,6 @@ _siftupmax(PyListObject *heap, Py_ssize_t pos) ...@@ -475,7 +476,6 @@ _siftupmax(PyListObject *heap, Py_ssize_t pos)
Py_DECREF(PyList_GET_ITEM(heap, pos)); Py_DECREF(PyList_GET_ITEM(heap, pos));
PyList_SET_ITEM(heap, pos, tmp); PyList_SET_ITEM(heap, pos, tmp);
pos = childpos; pos = childpos;
childpos = 2*pos + 1;
} }
/* The leaf at pos is empty now. Put newitem there, and bubble /* The leaf at pos is empty now. Put newitem there, and bubble
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment