handle receiving an invalid request
This commit is contained in:
parent
06f702b21a
commit
a138b2daa9
|
@ -2219,12 +2219,17 @@ namespace libtorrent
|
||||||
m_counters.inc_stats_counter(counters::invalid_piece_requests);
|
m_counters.inc_stats_counter(counters::invalid_piece_requests);
|
||||||
++m_num_invalid_requests;
|
++m_num_invalid_requests;
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
|
const bool valid_piece_index
|
||||||
|
= r.piece >= 0 && r.piece < int(t->torrent_file().num_pieces());
|
||||||
|
|
||||||
peer_log(peer_log_alert::info, "INVALID_REQUEST", "piece not superseeded "
|
peer_log(peer_log_alert::info, "INVALID_REQUEST", "piece not superseeded "
|
||||||
"i: %d t: %d n: %d h: %d ss1: %d ss2: %d"
|
"i: %d t: %d n: %d h: %d ss1: %d ss2: %d"
|
||||||
, m_peer_interested
|
, m_peer_interested
|
||||||
, int(t->torrent_file().piece_size(r.piece))
|
, valid_piece_index
|
||||||
|
? int(t->torrent_file().piece_size(r.piece))
|
||||||
|
: -1
|
||||||
, t->torrent_file().num_pieces()
|
, t->torrent_file().num_pieces()
|
||||||
, t->has_piece_passed(r.piece)
|
, valid_piece_index ? t->has_piece_passed(r.piece) : 0
|
||||||
, m_superseed_piece[0]
|
, m_superseed_piece[0]
|
||||||
, m_superseed_piece[1]);
|
, m_superseed_piece[1]);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -311,6 +311,22 @@ void send_extension_handshake(tcp::socket& s, entry const& e)
|
||||||
if (ec) TEST_ERROR(ec.message());
|
if (ec) TEST_ERROR(ec.message());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void send_request(tcp::socket& s, peer_request req)
|
||||||
|
{
|
||||||
|
using namespace libtorrent::detail;
|
||||||
|
|
||||||
|
log("==> request %d (%d,%d)", req.piece, req.start, req.length);
|
||||||
|
char msg[] = "\0\0\0\x0d\x06 "; // have_none
|
||||||
|
char* ptr = msg + 5;
|
||||||
|
write_uint32(req.piece, ptr);
|
||||||
|
write_uint32(req.start, ptr);
|
||||||
|
write_uint32(req.length, ptr);
|
||||||
|
error_code ec;
|
||||||
|
boost::asio::write(s, boost::asio::buffer(msg, 17)
|
||||||
|
, boost::asio::transfer_all(), ec);
|
||||||
|
if (ec) TEST_ERROR(ec.message());
|
||||||
|
}
|
||||||
|
|
||||||
entry read_extension_handshake(tcp::socket& s, char* recv_buffer, int size)
|
entry read_extension_handshake(tcp::socket& s, char* recv_buffer, int size)
|
||||||
{
|
{
|
||||||
for (;;)
|
for (;;)
|
||||||
|
@ -837,6 +853,28 @@ TORRENT_TEST(invalid_metadata_request)
|
||||||
print_session_log(*ses);
|
print_session_log(*ses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TORRENT_TEST(invalid_request)
|
||||||
|
{
|
||||||
|
std::cerr << "\n === test request ===\n" << std::endl;
|
||||||
|
|
||||||
|
sha1_hash ih;
|
||||||
|
boost::shared_ptr<lt::session> ses;
|
||||||
|
io_service ios;
|
||||||
|
tcp::socket s(ios);
|
||||||
|
setup_peer(s, ih, ses);
|
||||||
|
|
||||||
|
char recv_buffer[1000];
|
||||||
|
do_handshake(s, ih, recv_buffer);
|
||||||
|
print_session_log(*ses);
|
||||||
|
send_have_none(s);
|
||||||
|
|
||||||
|
peer_request req;
|
||||||
|
req.piece = 124134235;
|
||||||
|
req.start = 0;
|
||||||
|
req.length = 0x4000;
|
||||||
|
send_request(s, req);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // TORRENT_DISABLE_EXTENSIONS
|
#endif // TORRENT_DISABLE_EXTENSIONS
|
||||||
|
|
||||||
// TODO: test sending invalid requests (out of bound piece index, offsets and
|
// TODO: test sending invalid requests (out of bound piece index, offsets and
|
||||||
|
|
Loading…
Reference in New Issue