Fix a crash when receiving a request when we don't yet have the torrent info

This commit is contained in:
Matt Joiner 2019-08-23 12:19:28 +10:00
parent 00efae11ee
commit 95a521bad6
1 changed files with 5 additions and 4 deletions

View File

@ -1025,10 +1025,6 @@ func (c *connection) reject(r request) {
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
@ -1056,6 +1052,11 @@ func (c *connection) onReadRequest(r request) error {
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)
}