diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index 8fed51965..46a8d502d 100644 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -2219,12 +2219,17 @@ namespace libtorrent m_counters.inc_stats_counter(counters::invalid_piece_requests); ++m_num_invalid_requests; #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 " "i: %d t: %d n: %d h: %d ss1: %d ss2: %d" , 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->has_piece_passed(r.piece) + , valid_piece_index ? t->has_piece_passed(r.piece) : 0 , m_superseed_piece[0] , m_superseed_piece[1]); #endif diff --git a/test/test_fast_extension.cpp b/test/test_fast_extension.cpp index c24ccbd8c..249eb78f7 100644 --- a/test/test_fast_extension.cpp +++ b/test/test_fast_extension.cpp @@ -311,6 +311,22 @@ void send_extension_handshake(tcp::socket& s, entry const& e) 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) { for (;;) @@ -837,6 +853,28 @@ TORRENT_TEST(invalid_metadata_request) print_session_log(*ses); } +TORRENT_TEST(invalid_request) +{ + std::cerr << "\n === test request ===\n" << std::endl; + + sha1_hash ih; + boost::shared_ptr 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 // TODO: test sending invalid requests (out of bound piece index, offsets and