diff --git a/ChangeLog b/ChangeLog index 46e2e9c82..d44e1557c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ + * fix issue in reading resume data * revert NXDOMAIN change from 1.2.4 * don't open any listen sockets if listen_interfaces is empty or misconfigured * fix bug in auto disk cache size logic diff --git a/simulation/test_tracker.cpp b/simulation/test_tracker.cpp index dbf3d2b40..b72945946 100644 --- a/simulation/test_tracker.cpp +++ b/simulation/test_tracker.cpp @@ -1116,6 +1116,7 @@ TORRENT_TEST(tracker_ipv6_argument) pack.set_str(settings_pack::listen_interfaces, "123.0.0.3:0,[ffff::1337]:0"); ses.apply_settings(pack); p.ti = make_torrent(true); + p.info_hash.clear(); return 60; }, [&](std::string method, std::string req @@ -1154,6 +1155,7 @@ TORRENT_TEST(tracker_key_argument) [](lt::add_torrent_params& p, lt::session&) { p.ti = make_torrent(true); + p.info_hash.clear(); return 60; }, [&](std::string, std::string req @@ -1184,6 +1186,7 @@ TORRENT_TEST(tracker_ipv6_argument_non_private) pack.set_bool(settings_pack::anonymous_mode, false); ses.apply_settings(pack); p.ti = make_torrent(false); + p.info_hash.clear(); return 60; }, [&](std::string method, std::string req @@ -1212,6 +1215,7 @@ TORRENT_TEST(tracker_ipv6_argument_privacy_mode) pack.set_bool(settings_pack::anonymous_mode, true); ses.apply_settings(pack); p.ti = make_torrent(true); + p.info_hash.clear(); return 60; }, [&](std::string method, std::string req @@ -1240,6 +1244,7 @@ TORRENT_TEST(tracker_user_agent_privacy_mode_public_torrent) pack.set_str(settings_pack::user_agent, "test_agent/1.2.3"); ses.apply_settings(pack); p.ti = make_torrent(false); + p.info_hash.clear(); return 60; }, [&](std::string method, std::string req @@ -1267,6 +1272,7 @@ TORRENT_TEST(tracker_user_agent_privacy_mode_private_torrent) pack.set_str(settings_pack::user_agent, "test_agent/1.2.3"); ses.apply_settings(pack); p.ti = make_torrent(true); + p.info_hash.clear(); return 60; }, [&](std::string method, std::string req diff --git a/src/session_impl.cpp b/src/session_impl.cpp index 76170af12..d01634e76 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -4829,6 +4829,14 @@ namespace { return std::make_pair(ptr_t(), false); } + if (params.ti + && !params.info_hash.is_all_zeros() + && params.info_hash != params.ti->info_hash()) + { + ec = errors::mismatching_info_hash; + return std::make_pair(ptr_t(), false); + } + #ifndef TORRENT_DISABLE_DHT // add params.dht_nodes to the DHT, if enabled for (auto const& n : params.dht_nodes) diff --git a/src/torrent.cpp b/src/torrent.cpp index 12665e1fc..c4e5880a2 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -1873,6 +1873,9 @@ bool is_downloading_state(int const st) if (m_add_torrent_params) { piece_index_t idx(0); + if (m_add_torrent_params->piece_priorities.size() > std::size_t(m_torrent_file->num_pieces())) + m_add_torrent_params->piece_priorities.resize(std::size_t(m_torrent_file->num_pieces())); + for (auto prio : m_add_torrent_params->piece_priorities) { if (has_picker() || prio != default_priority) @@ -5054,7 +5057,12 @@ bool is_downloading_state(int const st) INVARIANT_CHECK; // this call is only valid on torrents with metadata - TORRENT_ASSERT(valid_metadata()); + if (!valid_metadata()) + { + pieces->clear(); + return; + } + if (!has_picker()) { pieces->clear(); diff --git a/test/test_torrent.cpp b/test/test_torrent.cpp index d76172dbe..af965abf5 100644 --- a/test/test_torrent.cpp +++ b/test/test_torrent.cpp @@ -277,6 +277,7 @@ TORRENT_TEST(added_peers) add_torrent_params p = parse_magnet_uri( "magnet:?xt=urn:btih:abababababababababababababababababababab&x.pe=127.0.0.1:48081&x.pe=127.0.0.2:48082"); p.ti = info; + p.info_hash.clear(); p.save_path = "."; torrent_handle h = ses.add_torrent(std::move(p)); @@ -290,6 +291,89 @@ TORRENT_TEST(added_peers) if (ra) TEST_EQUAL(ra->params.peers.size(), 2); } +TORRENT_TEST(mismatching_info_hash) +{ + file_storage fs; + fs.add_file("test_torrent_dir4/tmp1", 1024); + lt::create_torrent t(fs, 1024); + std::vector tmp; + bencode(std::back_inserter(tmp), t.generate()); + auto info = std::make_shared(tmp, from_span); + + add_torrent_params p; + p.ti = std::move(info); + + // this info-hash is definitely different from the one in `info`, this + // should trigger a failure + p.info_hash = lt::sha1_hash("01010101010101010101"); + p.save_path = "."; + + lt::session ses(settings()); + error_code ec; + torrent_handle h = ses.add_torrent(std::move(p), ec); + TEST_CHECK(ec == lt::errors::mismatching_info_hash); + TEST_CHECK(!h.is_valid()); +} + +TORRENT_TEST(exceed_file_prio) +{ + file_storage fs; + fs.add_file("test_torrent_dir4/tmp1", 1024); + lt::create_torrent t(fs, 1024); + std::vector tmp; + bencode(std::back_inserter(tmp), t.generate()); + auto info = std::make_shared(tmp, from_span); + + add_torrent_params p; + p.ti = std::move(info); + + p.file_priorities.resize(9999, lt::low_priority); + p.save_path = "."; + + lt::session ses(settings()); + error_code ec; + torrent_handle h = ses.add_torrent(std::move(p)); + auto const prios = h.get_file_priorities(); + TEST_CHECK(prios.size() == 1); +} + +TORRENT_TEST(exceed_piece_prio) +{ + file_storage fs; + fs.add_file("test_torrent_dir4/tmp1", 1024); + lt::create_torrent t(fs, 1024); + std::vector tmp; + bencode(std::back_inserter(tmp), t.generate()); + auto info = std::make_shared(tmp, from_span); + std::size_t const num_pieces = std::size_t(info->num_pieces()); + + add_torrent_params p; + p.ti = std::move(info); + + p.piece_priorities.resize(9999, lt::low_priority); + p.save_path = "."; + + lt::session ses(settings()); + error_code ec; + torrent_handle h = ses.add_torrent(std::move(p)); + auto const prios = h.get_piece_priorities(); + TEST_CHECK(prios.size() == num_pieces); +} + +TORRENT_TEST(exceed_piece_prio_magnet) +{ + add_torrent_params p; + p.info_hash = sha1_hash("abababababababababab"); + p.piece_priorities.resize(9999, lt::low_priority); + p.save_path = "."; + + lt::session ses(settings()); + error_code ec; + torrent_handle h = ses.add_torrent(std::move(p)); + auto const prios = h.get_piece_priorities(); + TEST_CHECK(prios.empty()); +} + TORRENT_TEST(torrent) { /* {