diff options
author | Viktor TrĂ³n <viktor.tron@gmail.com> | 2018-09-26 18:44:42 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-26 18:44:42 +0800 |
commit | 4b6824e07b1b7c5a2907143b4d122283eadb2474 (patch) | |
tree | 636b5377de9aa45f678c4c93a2dc72aafd687b81 /swarm/network/stream/messages.go | |
parent | 26cf866349034b0a7d8ef297f6f76125227eb9af (diff) | |
parent | d3f056bd68fb6a8e9ffa3938d5404c6a209e0313 (diff) | |
download | dexon-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar dexon-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.gz dexon-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.bz2 dexon-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.lz dexon-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.xz dexon-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.zst dexon-4b6824e07b1b7c5a2907143b4d122283eadb2474.zip |
Merge pull request #17734 from frncmx/fix-dos-attack-invalid-hash-length
swarm/network/stream: fix DoS invalid offered hashes length
Diffstat (limited to 'swarm/network/stream/messages.go')
-rw-r--r-- | swarm/network/stream/messages.go | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/swarm/network/stream/messages.go b/swarm/network/stream/messages.go index 0332322f4..117f88044 100644 --- a/swarm/network/stream/messages.go +++ b/swarm/network/stream/messages.go @@ -26,7 +26,7 @@ import ( bv "github.com/ethereum/go-ethereum/swarm/network/bitvector" "github.com/ethereum/go-ethereum/swarm/spancontext" "github.com/ethereum/go-ethereum/swarm/storage" - opentracing "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go" ) var syncBatchTimeout = 30 * time.Second @@ -195,10 +195,16 @@ func (p *Peer) handleOfferedHashesMsg(ctx context.Context, req *OfferedHashesMsg if err != nil { return err } + hashes := req.Hashes - want, err := bv.New(len(hashes) / HashSize) + lenHashes := len(hashes) + if lenHashes%HashSize != 0 { + return fmt.Errorf("error invalid hashes length (len: %v)", lenHashes) + } + + want, err := bv.New(lenHashes / HashSize) if err != nil { - return fmt.Errorf("error initiaising bitvector of length %v: %v", len(hashes)/HashSize, err) + return fmt.Errorf("error initiaising bitvector of length %v: %v", lenHashes/HashSize, err) } ctr := 0 @@ -206,7 +212,7 @@ func (p *Peer) handleOfferedHashesMsg(ctx context.Context, req *OfferedHashesMsg ctx, cancel := context.WithTimeout(ctx, syncBatchTimeout) ctx = context.WithValue(ctx, "source", p.ID().String()) - for i := 0; i < len(hashes); i += HashSize { + for i := 0; i < lenHashes; i += HashSize { hash := hashes[i : i+HashSize] if wait := c.NeedData(ctx, hash); wait != nil { |