[Python-checkins] cpython (2.7): Issue 21375: Fix possible Py_ssizet overflow in heapq.
raymond.hettinger
python-checkins at python.org
Sun May 4 00:30:18 CEST 2014
http://hg.python.org/cpython/rev/b768d41dec0a
changeset: 90544:b768d41dec0a
branch: 2.7
parent: 90536:5f75eadecff1
user: Raymond Hettinger <python at rcn.com>
date: Sat May 03 15:27:14 2014 -0700
summary:
Issue 21375: Fix possible Py_ssizet overflow in heapq.
files:
Modules/_heapqmodule.c | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c
--- a/Modules/_heapqmodule.c
+++ b/Modules/_heapqmodule.c
@@ -86,7 +86,7 @@
static int
_siftup(PyListObject *heap, Py_ssize_t pos)
{
- Py_ssize_t startpos, endpos, childpos, rightpos;
+ Py_ssize_t startpos, endpos, childpos, rightpos, limit;
int cmp;
PyObject *newitem, *tmp, *olditem;
Py_ssize_t size;
@@ -103,9 +103,10 @@
Py_INCREF(newitem);
/* Bubble up the smaller child until hitting a leaf. */
- childpos = 2*pos + 1; /* leftmost child position */
- while (childpos < endpos) {
+ limit = endpos / 2; /* smallest pos that has no child */
+ while (pos < limit) {
/* Set childpos to index of smaller child. */
+ childpos = 2*pos + 1; /* leftmost child position */
rightpos = childpos + 1;
if (rightpos < endpos) {
cmp = cmp_lt(
@@ -131,7 +132,6 @@
PyList_SET_ITEM(heap, pos, tmp);
Py_DECREF(olditem);
pos = childpos;
- childpos = 2*pos + 1;
if (size != PyList_GET_SIZE(heap)) {
PyErr_SetString(PyExc_RuntimeError,
"list changed size during iteration");
@@ -439,7 +439,7 @@
static int
_siftupmax(PyListObject *heap, Py_ssize_t pos)
{
- Py_ssize_t startpos, endpos, childpos, rightpos;
+ Py_ssize_t startpos, endpos, childpos, rightpos, limit;
int cmp;
PyObject *newitem, *tmp;
@@ -454,9 +454,10 @@
Py_INCREF(newitem);
/* Bubble up the smaller child until hitting a leaf. */
- childpos = 2*pos + 1; /* leftmost child position */
- while (childpos < endpos) {
+ limit = endpos / 2; /* smallest pos that has no child */
+ while (pos < limit) {
/* Set childpos to index of smaller child. */
+ childpos = 2*pos + 1; /* leftmost child position */
rightpos = childpos + 1;
if (rightpos < endpos) {
cmp = cmp_lt(
@@ -475,7 +476,6 @@
Py_DECREF(PyList_GET_ITEM(heap, pos));
PyList_SET_ITEM(heap, pos, tmp);
pos = childpos;
- childpos = 2*pos + 1;
}
/* The leaf at pos is empty now. Put newitem there, and bubble
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list