func (c *connection) onReadRequest(r request) error {
requestedChunkLengths.Add(strconv.FormatUint(r.Length.Uint64(), 10), 1)
- if r.Begin+r.Length > c.t.pieceLength(pieceIndex(r.Index)) {
- torrent.Add("bad requests received", 1)
- return errors.New("bad request")
- }
if _, ok := c.PeerRequests[r]; ok {
torrent.Add("duplicate requests received", 1)
return nil
requestsReceivedForMissingPieces.Add(1)
return fmt.Errorf("peer requested piece we don't have: %v", r.Index.Int())
}
+ // Check this after we know we have the piece, so that the piece length will be known.
+ if r.Begin+r.Length > c.t.pieceLength(pieceIndex(r.Index)) {
+ torrent.Add("bad requests received", 1)
+ return errors.New("bad request")
+ }
if c.PeerRequests == nil {
c.PeerRequests = make(map[request]struct{}, maxRequests)
}