From aa149ad16bdd95020ef849ceda1b0e443c92c094 Mon Sep 17 00:00:00 2001 From: Ferenc Szabo Date: Thu, 17 Jan 2019 10:41:02 +0100 Subject: [PATCH] swarm/network: fix data race in stream.(*Peer).handleOfferedHashesMsg() handleOfferedHashesMsg() contained a data race: - read => in a goroutine, call to c.batchDone() - write => in the main thread, write to c.sessionAt c.batchDone() contained a call to c.AddInterval(). Client was a value receiver for AddInterval. So on c.AddInterval() call the whole client struct got copied (read) while one of its field was modified in handleOfferedHashesMsg() (write). fixes ethersphere/go-ethereum#1086 --- swarm/network/stream/stream.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swarm/network/stream/stream.go b/swarm/network/stream/stream.go index fb571c8566..67a04b992a 100644 --- a/swarm/network/stream/stream.go +++ b/swarm/network/stream/stream.go @@ -666,7 +666,7 @@ func peerStreamIntervalsKey(p *Peer, s Stream) string { return p.ID().String() + s.String() } -func (c client) AddInterval(start, end uint64) (err error) { +func (c *client) AddInterval(start, end uint64) (err error) { i := &intervals.Intervals{} err = c.intervalsStore.Get(c.intervalsKey, i) if err != nil { @@ -676,7 +676,7 @@ func (c client) AddInterval(start, end uint64) (err error) { return c.intervalsStore.Put(c.intervalsKey, i) } -func (c client) NextInterval() (start, end uint64, err error) { +func (c *client) NextInterval() (start, end uint64, err error) { i := &intervals.Intervals{} err = c.intervalsStore.Get(c.intervalsKey, i) if err != nil {