aquatic: announce handler: improve safety by small margin

This commit is contained in:
Joakim Frostegård 2020-04-08 20:26:39 +02:00
parent 789783cfe4
commit 766606cc08

View file

@ -84,43 +84,47 @@ pub fn handle_announce_requests(
let max_num_peers_to_take = (request.peers_wanted.0.max(0) as usize) let max_num_peers_to_take = (request.peers_wanted.0.max(0) as usize)
.min(config.max_response_peers); .min(config.max_response_peers);
let torrent_data = state.torrents.get(&request.info_hash).unwrap(); // Since there is a miniscule risk of the torrent having been removed
// by now, don't unwrap the result.
if let Some(torrent_data) = state.torrents.get(&request.info_hash){
match peer_status {
PeerStatus::Leeching => {
torrent_data.num_leechers.fetch_add(1, Ordering::SeqCst);
},
PeerStatus::Seeding => {
torrent_data.num_seeders.fetch_add(1, Ordering::SeqCst);
},
PeerStatus::Stopped => {}
};
match peer_status { match opt_removed_peer_status {
PeerStatus::Leeching => { Some(PeerStatus::Leeching) => {
torrent_data.num_leechers.fetch_add(1, Ordering::SeqCst); torrent_data.num_leechers.fetch_sub(1, Ordering::SeqCst);
}, },
PeerStatus::Seeding => { Some(PeerStatus::Seeding) => {
torrent_data.num_seeders.fetch_add(1, Ordering::SeqCst); torrent_data.num_seeders.fetch_sub(1, Ordering::SeqCst);
}, },
PeerStatus::Stopped => {} _ => {}
}; }
match opt_removed_peer_status { let response_peers = extract_response_peers(
Some(PeerStatus::Leeching) => { &mut rng,
torrent_data.num_leechers.fetch_sub(1, Ordering::SeqCst); &torrent_data.peers,
}, max_num_peers_to_take,
Some(PeerStatus::Seeding) => { );
torrent_data.num_seeders.fetch_sub(1, Ordering::SeqCst);
}, let response = Response::Announce(AnnounceResponse {
_ => {} transaction_id: request.transaction_id,
announce_interval: AnnounceInterval(600), // FIXME
leechers: NumberOfPeers(torrent_data.num_leechers.load(Ordering::SeqCst) as i32),
seeders: NumberOfPeers(torrent_data.num_seeders.load(Ordering::SeqCst) as i32),
peers: response_peers
});
Some((response, src))
} else {
None
} }
let response_peers = extract_response_peers(
&mut rng,
&torrent_data.peers,
max_num_peers_to_take,
);
let response = Response::Announce(AnnounceResponse {
transaction_id: request.transaction_id,
announce_interval: AnnounceInterval(600), // FIXME
leechers: NumberOfPeers(torrent_data.num_leechers.load(Ordering::SeqCst) as i32),
seeders: NumberOfPeers(torrent_data.num_seeders.load(Ordering::SeqCst) as i32),
peers: response_peers
});
Some((response, src))
})); }));
} }