Kaydet (Commit) 10c7e864 authored tarafından Tim Peters's avatar Tim Peters

deque_traverse(): If the deque had one block, and its rightindex was

BLOCKLEN-1, this assert-failed in a debug build, or went wild with a
NULL pointer in a release build.  Reported on c.l.py by Stefan Behnel.
üst d6e00327
...@@ -324,6 +324,15 @@ class TestBasic(unittest.TestCase): ...@@ -324,6 +324,15 @@ class TestBasic(unittest.TestCase):
for s in ('abcd', xrange(2000)): for s in ('abcd', xrange(2000)):
self.assertEqual(list(reversed(deque(s))), list(reversed(s))) self.assertEqual(list(reversed(deque(s))), list(reversed(s)))
def test_gc_doesnt_blowup(self):
import gc
# This used to assert-fail in deque_traverse() under a debug
# build, or run wild with a NULL pointer in a release build.
d = deque()
for i in xrange(100):
d.append(1)
gc.collect()
def R(seqn): def R(seqn):
'Regular generator' 'Regular generator'
for i in seqn: for i in seqn:
......
...@@ -478,19 +478,22 @@ deque_dealloc(dequeobject *deque) ...@@ -478,19 +478,22 @@ deque_dealloc(dequeobject *deque)
static int static int
deque_traverse(dequeobject *deque, visitproc visit, void *arg) deque_traverse(dequeobject *deque, visitproc visit, void *arg)
{ {
block * b = deque->leftblock; block *b;
int index = deque->leftindex;
PyObject *item; PyObject *item;
int index;
int indexlo = deque->leftindex;
while (b != deque->rightblock || index <= deque->rightindex) { assert(deque->leftblock != NULL);
item = b->data[index]; for (b = deque->leftblock; b != NULL; b = b->rightlink) {
index++; const int indexhi = b == deque->rightblock ?
if (index == BLOCKLEN ) { deque->rightindex :
assert(b->rightlink != NULL); BLOCKLEN - 1;
b = b->rightlink;
index = 0; for (index = indexlo; index <= indexhi; ++index) {
item = b->data[index];
Py_VISIT(item);
} }
Py_VISIT(item); indexlo = 0;
} }
return 0; return 0;
} }
......
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