Skip to content

Commit bc47993

Browse files
authored
tests/fuzzers: fix goroutine leak in les fuzzer (#22455)
The oss-fuzz fuzzer has been reporting some failing testcases for les. They're all spurious, and cannot reliably be reproduced. However, running them showed that there was a goroutine leak: the tests created a lot of new clients, which started an exec queue that was never torn down. This PR fixes the goroutine leak, and also a log message which was erroneously formatted.
1 parent faacc8e commit bc47993

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

les/server_requests.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,8 @@ func handleGetBlockHeaders(msg Decoder) (serveRequestFn, uint64, uint64, error)
206206
next = current + r.Query.Skip + 1
207207
)
208208
if next <= current {
209-
infos, _ := json.MarshalIndent(p.Peer.Info(), "", " ")
210-
p.Log().Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", r.Query.Skip, "next", next, "attacker", infos)
209+
infos, _ := json.Marshal(p.Peer.Info())
210+
p.Log().Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", r.Query.Skip, "next", next, "attacker", string(infos))
211211
unknown = true
212212
} else {
213213
if header := bc.GetHeaderByNumber(next); header != nil {

les/test_helper.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,10 @@ func newClientServerEnv(t *testing.T, config testnetConfig) (*testServer, *testC
661661
return s, c, teardown
662662
}
663663

664-
func NewFuzzerPeer(version int) *clientPeer {
665-
return newClientPeer(version, 0, p2p.NewPeer(enode.ID{}, "", nil), nil)
664+
// NewFuzzerPeer creates a client peer for test purposes, and also returns
665+
// a function to close the peer: this is needed to avoid goroutine leaks in the
666+
// exec queue.
667+
func NewFuzzerPeer(version int) (p *clientPeer, closer func()) {
668+
p = newClientPeer(version, 0, p2p.NewPeer(enode.ID{}, "", nil), nil)
669+
return p, func() { p.peerCommons.close() }
666670
}

tests/fuzzers/les/les-fuzzer.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,18 +261,18 @@ func (d dummyMsg) Decode(val interface{}) error {
261261
}
262262

263263
func (f *fuzzer) doFuzz(msgCode uint64, packet interface{}) {
264-
version := f.randomInt(3) + 2 // [LES2, LES3, LES4]
265-
peer := l.NewFuzzerPeer(version)
266264
enc, err := rlp.EncodeToBytes(packet)
267265
if err != nil {
268266
panic(err)
269267
}
268+
version := f.randomInt(3) + 2 // [LES2, LES3, LES4]
269+
peer, closeFn := l.NewFuzzerPeer(version)
270+
defer closeFn()
270271
fn, _, _, err := l.Les3[msgCode].Handle(dummyMsg{enc})
271272
if err != nil {
272273
panic(err)
273274
}
274275
fn(f, peer, func() bool { return true })
275-
276276
}
277277

278278
func Fuzz(input []byte) int {

0 commit comments

Comments
 (0)