p2p/dnsdisc: fix crash when iterator closed before first call to Next (#22906)
This commit is contained in:
parent
3e795881ea
commit
16bc57438b
@ -298,6 +298,12 @@ func (it *randomIterator) pickTree() *clientTree {
|
|||||||
it.mu.Lock()
|
it.mu.Lock()
|
||||||
defer it.mu.Unlock()
|
defer it.mu.Unlock()
|
||||||
|
|
||||||
|
// First check if iterator was closed.
|
||||||
|
// Need to do this here to avoid nil map access in rebuildTrees.
|
||||||
|
if it.trees == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Rebuild the trees map if any links have changed.
|
// Rebuild the trees map if any links have changed.
|
||||||
if it.lc.changed {
|
if it.lc.changed {
|
||||||
it.rebuildTrees()
|
it.rebuildTrees()
|
||||||
|
@ -115,6 +115,21 @@ func TestIterator(t *testing.T) {
|
|||||||
checkIterator(t, it, nodes)
|
checkIterator(t, it, nodes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIteratorCloseWithoutNext(t *testing.T) {
|
||||||
|
tree1, url1 := makeTestTree("t1", nil, nil)
|
||||||
|
c := NewClient(Config{Resolver: newMapResolver(tree1.ToTXT("t1"))})
|
||||||
|
it, err := c.NewIterator(url1)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
it.Close()
|
||||||
|
ok := it.Next()
|
||||||
|
if ok {
|
||||||
|
t.Fatal("Next returned true after Close")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// This test checks if closing randomIterator races.
|
// This test checks if closing randomIterator races.
|
||||||
func TestIteratorClose(t *testing.T) {
|
func TestIteratorClose(t *testing.T) {
|
||||||
nodes := testNodes(nodesSeed1, 500)
|
nodes := testNodes(nodesSeed1, 500)
|
||||||
|
Loading…
Reference in New Issue
Block a user