From 836c846812a903258f0612556481d96b3fa98758 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jano=C5=A1=20Gulja=C5=A1?= <janos@users.noreply.github.com>
Date: Thu, 21 Feb 2019 18:33:49 +0100
Subject: [PATCH] swarm/network/master: protect SetNextBatch iterator after
 close (#19147)

---
 swarm/network/stream/stream.go | 10 ++++++++++
 swarm/network/stream/syncer.go |  5 +++++
 2 files changed, 15 insertions(+)

diff --git a/swarm/network/stream/stream.go b/swarm/network/stream/stream.go
index 8e2a5f31a..3bc450455 100644
--- a/swarm/network/stream/stream.go
+++ b/swarm/network/stream/stream.go
@@ -597,6 +597,16 @@ func (r *Registry) runProtocol(p *p2p.Peer, rw p2p.MsgReadWriter) error {
 
 // HandleMsg is the message handler that delegates incoming messages
 func (p *Peer) HandleMsg(ctx context.Context, msg interface{}) error {
+	select {
+	case <-p.streamer.quit:
+		log.Trace("message received after the streamer is closed", "peer", p.ID())
+		// return without an error since streamer is closed and
+		// no messages should be handled as other subcomponents like
+		// storage leveldb may be closed
+		return nil
+	default:
+	}
+
 	switch msg := msg.(type) {
 
 	case *SubscribeMsg:
diff --git a/swarm/network/stream/syncer.go b/swarm/network/stream/syncer.go
index 4fb8b9342..5f03dcff7 100644
--- a/swarm/network/stream/syncer.go
+++ b/swarm/network/stream/syncer.go
@@ -107,6 +107,11 @@ func (s *SwarmSyncerServer) SetNextBatch(from, to uint64) ([]byte, uint64, uint6
 
 		metrics.GetOrRegisterCounter("syncer.setnextbatch.iterator", nil).Inc(1)
 		err := s.store.Iterator(from, to, s.po, func(key storage.Address, idx uint64) bool {
+			select {
+			case <-s.quit:
+				return false
+			default:
+			}
 			batch = append(batch, key[:]...)
 			i++
 			to = idx
-- 
GitLab