aboutsummaryrefslogtreecommitdiffstats
path: root/swarm/network/stream
diff options
context:
space:
mode:
authorFerenc Szabo <frncmx@gmail.com>2019-01-17 21:44:29 +0800
committerAnton Evangelatov <anton.evangelatov@gmail.com>2019-01-17 21:44:29 +0800
commit4f8ec445653aa5131eb18fd6f821ed5fc284fd42 (patch)
treee28de46f60c38d42630939511a460b6705a8ef6d /swarm/network/stream
parent81e26d5a4837077d5fff17e7b461061b134a4a00 (diff)
downloadgo-tangerine-4f8ec445653aa5131eb18fd6f821ed5fc284fd42.tar
go-tangerine-4f8ec445653aa5131eb18fd6f821ed5fc284fd42.tar.gz
go-tangerine-4f8ec445653aa5131eb18fd6f821ed5fc284fd42.tar.bz2
go-tangerine-4f8ec445653aa5131eb18fd6f821ed5fc284fd42.tar.lz
go-tangerine-4f8ec445653aa5131eb18fd6f821ed5fc284fd42.tar.xz
go-tangerine-4f8ec445653aa5131eb18fd6f821ed5fc284fd42.tar.zst
go-tangerine-4f8ec445653aa5131eb18fd6f821ed5fc284fd42.zip
swarm/network: fix data race in stream.(*Peer).handleOfferedHashesMsg() (#18468)
* 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: simplify some trivial statements
Diffstat (limited to 'swarm/network/stream')
-rw-r--r--swarm/network/stream/stream.go13
1 files changed, 4 insertions, 9 deletions
diff --git a/swarm/network/stream/stream.go b/swarm/network/stream/stream.go
index fb571c856..989fbaeb0 100644
--- a/swarm/network/stream/stream.go
+++ b/swarm/network/stream/stream.go
@@ -666,17 +666,16 @@ 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 {
+ if err = c.intervalsStore.Get(c.intervalsKey, i); err != nil {
return err
}
i.Add(start, end)
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 {
@@ -733,11 +732,7 @@ func (c *client) batchDone(p *Peer, req *OfferedHashesMsg, hashes []byte) error
}
return nil
}
- // TODO: make a test case for testing if the interval is added when the batch is done
- if err := c.AddInterval(req.From, req.To); err != nil {
- return err
- }
- return nil
+ return c.AddInterval(req.From, req.To)
}
func (c *client) close() {