mirror of
https://github.com/HDT3213/godis.git
synced 2025-10-05 16:57:06 +08:00
bugfix: Runtime error will happen in RemoveAllByVal() if iter.remove() removes quicklist's last page (it happens when last page has only one item) and the quicklist is not empty. In this case, iter.atEnd() will be false, which will cause a nil pointer dereference.
Solution: If iter.remove() remove last item, let it meet iter.atEnd().
This commit is contained in:
@@ -227,10 +227,17 @@ func (iter *iterator) remove() interface{} {
|
|||||||
} else {
|
} else {
|
||||||
// page is empty, update iter.node and iter.offset
|
// page is empty, update iter.node and iter.offset
|
||||||
if iter.node == iter.ql.data.Back() {
|
if iter.node == iter.ql.data.Back() {
|
||||||
// removed last element, ql is empty now
|
// move iter so iter.atEnd() can be true
|
||||||
iter.ql.data.Remove(iter.node)
|
if prevNode := iter.node.Prev(); prevNode != nil {
|
||||||
iter.node = nil
|
iter.ql.data.Remove(iter.node)
|
||||||
iter.offset = 0
|
iter.node = prevNode
|
||||||
|
iter.offset = len(prevNode.Value.([]interface{}))
|
||||||
|
} else {
|
||||||
|
// removed last element, ql is empty now
|
||||||
|
iter.ql.data.Remove(iter.node)
|
||||||
|
iter.node = nil
|
||||||
|
iter.offset = 0
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
nextNode := iter.node.Next()
|
nextNode := iter.node.Next()
|
||||||
iter.ql.data.Remove(iter.node)
|
iter.ql.data.Remove(iter.node)
|
||||||
|
Reference in New Issue
Block a user