diff --git a/swarm/network/stream/delivery.go b/swarm/network/stream/delivery.go index 91212cebde..36040339d3 100644 --- a/swarm/network/stream/delivery.go +++ b/swarm/network/stream/delivery.go @@ -230,6 +230,11 @@ R: for req := range d.receiveC { processReceivedChunksCount.Inc(1) + if len(req.SData) > cp.DefaultSize+8 { + log.Warn("received chunk is bigger than expected", "len", len(req.SData)) + continue R + } + // this should be has locally chunk, err := d.db.Get(context.TODO(), req.Addr) if err == nil { @@ -245,10 +250,6 @@ R: continue R default: } - if len(req.SData) > cp.DefaultSize { - log.Warn("received chunk is bigger than expected", "len", len(req.SData)) - continue R - } chunk.SData = req.SData d.db.Put(context.TODO(), chunk) diff --git a/swarm/storage/types.go b/swarm/storage/types.go index 3d0cf2caf2..03a0418ee3 100644 --- a/swarm/storage/types.go +++ b/swarm/storage/types.go @@ -355,3 +355,12 @@ func (v *ContentAddressValidator) Validate(addr Address, data []byte) bool { return bytes.Equal(hash, addr[:]) } + +// SizeValidator provides method for validation of max chunk data size +type SizeValidator struct { +} + +// Validate that the chunk has valid size +func (v *SizeValidator) Validate(_ Address, data []byte) bool { + return len(data) <= 8+chunk.DefaultSize +} diff --git a/swarm/swarm.go b/swarm/swarm.go index c380a376f6..758e815f47 100644 --- a/swarm/swarm.go +++ b/swarm/swarm.go @@ -201,8 +201,10 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e } resourceHandler.SetStore(netStore) - var validators []storage.ChunkValidator - validators = append(validators, storage.NewContentAddressValidator(storage.MakeHashFunc(storage.DefaultHash))) + validators := []storage.ChunkValidator{ + storage.NewContentAddressValidator(storage.MakeHashFunc(storage.DefaultHash)), + &storage.SizeValidator{}, + } if resourceHandler != nil { validators = append(validators, resourceHandler) }