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:
Tim Peters 2004-10-01 02:01:04 +00:00
parent d6e0032768
commit 10c7e86454
2 changed files with 22 additions and 10 deletions

View file

@ -478,19 +478,22 @@ deque_dealloc(dequeobject *deque)
static int
deque_traverse(dequeobject *deque, visitproc visit, void *arg)
{
block * b = deque->leftblock;
int index = deque->leftindex;
block *b;
PyObject *item;
int index;
int indexlo = deque->leftindex;
while (b != deque->rightblock || index <= deque->rightindex) {
item = b->data[index];
index++;
if (index == BLOCKLEN ) {
assert(b->rightlink != NULL);
b = b->rightlink;
index = 0;
assert(deque->leftblock != NULL);
for (b = deque->leftblock; b != NULL; b = b->rightlink) {
const int indexhi = b == deque->rightblock ?
deque->rightindex :
BLOCKLEN - 1;
for (index = indexlo; index <= indexhi; ++index) {
item = b->data[index];
Py_VISIT(item);
}
Py_VISIT(item);
indexlo = 0;
}
return 0;
}