mirror of
https://github.com/python/cpython.git
synced 2025-08-01 23:53:15 +00:00
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.
This commit is contained in:
parent
d6e0032768
commit
10c7e86454
2 changed files with 22 additions and 10 deletions
|
@ -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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue