forked from premiere/premiere-libtorrent
add piece index range checks on have_piece() and read_piece()
This commit is contained in:
parent
27836ede70
commit
a1f2995716
|
@ -777,6 +777,15 @@ namespace libtorrent {
|
||||||
return m_picker->have_piece(index);
|
return m_picker->have_piece(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns true if we have downloaded the given piece
|
||||||
|
bool user_have_piece(piece_index_t index) const
|
||||||
|
{
|
||||||
|
if (!valid_metadata()) return false;
|
||||||
|
if (index < piece_index_t{0} || index >= m_torrent_file->end_piece()) return false;
|
||||||
|
if (!has_picker()) return m_have_all;
|
||||||
|
return m_picker->have_piece(index);
|
||||||
|
}
|
||||||
|
|
||||||
// returns true if we have downloaded the given piece
|
// returns true if we have downloaded the given piece
|
||||||
bool has_piece_passed(piece_index_t index) const
|
bool has_piece_passed(piece_index_t index) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -830,11 +830,23 @@ bool is_downloading_state(int const st)
|
||||||
|
|
||||||
void torrent::read_piece(piece_index_t const piece)
|
void torrent::read_piece(piece_index_t const piece)
|
||||||
{
|
{
|
||||||
|
error_code ec;
|
||||||
if (m_abort || m_deleted)
|
if (m_abort || m_deleted)
|
||||||
{
|
{
|
||||||
// failed
|
ec.assign(boost::system::errc::operation_canceled, generic_category());
|
||||||
m_ses.alerts().emplace_alert<read_piece_alert>(
|
}
|
||||||
get_handle(), piece, error_code(boost::system::errc::operation_canceled, generic_category()));
|
else if (!valid_metadata())
|
||||||
|
{
|
||||||
|
ec.assign(errors::no_metadata, libtorrent_category());
|
||||||
|
}
|
||||||
|
else if (piece < piece_index_t{0} || piece >= m_torrent_file->end_piece())
|
||||||
|
{
|
||||||
|
ec.assign(errors::invalid_piece_index, libtorrent_category());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ec)
|
||||||
|
{
|
||||||
|
m_ses.alerts().emplace_alert<read_piece_alert>(get_handle(), piece, ec);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -664,7 +664,7 @@ namespace libtorrent {
|
||||||
|
|
||||||
bool torrent_handle::have_piece(piece_index_t piece) const
|
bool torrent_handle::have_piece(piece_index_t piece) const
|
||||||
{
|
{
|
||||||
return sync_call_ret<bool>(false, &torrent::have_piece, piece);
|
return sync_call_ret<bool>(false, &torrent::user_have_piece, piece);
|
||||||
}
|
}
|
||||||
|
|
||||||
storage_interface* torrent_handle::get_storage_impl() const
|
storage_interface* torrent_handle::get_storage_impl() const
|
||||||
|
|
|
@ -618,3 +618,76 @@ TORRENT_TEST(test_move_storage_no_metadata)
|
||||||
|
|
||||||
TEST_EQUAL(h.status().save_path, complete("save_path_1"));
|
TEST_EQUAL(h.status().save_path, complete("save_path_1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TORRENT_TEST(test_have_piece_no_metadata)
|
||||||
|
{
|
||||||
|
lt::session ses(settings());
|
||||||
|
error_code ec;
|
||||||
|
add_torrent_params p = parse_magnet_uri("magnet?xt=urn:btih:abababababababababababababababababababab", ec);
|
||||||
|
p.save_path = "save_path";
|
||||||
|
torrent_handle h = ses.add_torrent(p);
|
||||||
|
|
||||||
|
TEST_EQUAL(h.have_piece(piece_index_t{-1}), false);
|
||||||
|
TEST_EQUAL(h.have_piece(piece_index_t{0}), false);
|
||||||
|
TEST_EQUAL(h.have_piece(piece_index_t{100}), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TORRENT_TEST(test_have_piece_out_of_range)
|
||||||
|
{
|
||||||
|
lt::session ses(settings());
|
||||||
|
error_code ec;
|
||||||
|
|
||||||
|
add_torrent_params p;
|
||||||
|
static std::array<const int, 2> const file_sizes{{100000, 100000}};
|
||||||
|
int const piece_size = 0x8000;
|
||||||
|
p.ti = make_torrent(file_sizes, piece_size);
|
||||||
|
p.save_path = "save_path";
|
||||||
|
p.flags |= torrent_flags::seed_mode;
|
||||||
|
torrent_handle h = ses.add_torrent(p);
|
||||||
|
|
||||||
|
TEST_EQUAL(h.have_piece(piece_index_t{-1}), false);
|
||||||
|
TEST_EQUAL(h.have_piece(piece_index_t{0}), true);
|
||||||
|
TEST_EQUAL(h.have_piece(piece_index_t{100}), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TORRENT_TEST(test_read_piece_no_metadata)
|
||||||
|
{
|
||||||
|
lt::session ses(settings());
|
||||||
|
error_code ec;
|
||||||
|
add_torrent_params p = parse_magnet_uri("magnet?xt=urn:btih:abababababababababababababababababababab", ec);
|
||||||
|
p.save_path = "save_path";
|
||||||
|
torrent_handle h = ses.add_torrent(p);
|
||||||
|
|
||||||
|
h.read_piece(piece_index_t{-1});
|
||||||
|
|
||||||
|
alert const* a = wait_for_alert(ses, read_piece_alert::alert_type, "read_piece_alert");
|
||||||
|
TEST_CHECK(a);
|
||||||
|
if (auto* rp = alert_cast<read_piece_alert>(a))
|
||||||
|
{
|
||||||
|
TEST_CHECK(rp->error == error_code(lt::errors::no_metadata, lt::libtorrent_category()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TORRENT_TEST(test_read_piece_out_of_range)
|
||||||
|
{
|
||||||
|
lt::session ses(settings());
|
||||||
|
error_code ec;
|
||||||
|
|
||||||
|
add_torrent_params p;
|
||||||
|
static std::array<const int, 2> const file_sizes{{100000, 100000}};
|
||||||
|
int const piece_size = 0x8000;
|
||||||
|
p.ti = make_torrent(file_sizes, piece_size);
|
||||||
|
p.save_path = "save_path";
|
||||||
|
p.flags |= torrent_flags::seed_mode;
|
||||||
|
torrent_handle h = ses.add_torrent(p);
|
||||||
|
|
||||||
|
h.read_piece(piece_index_t{-1});
|
||||||
|
|
||||||
|
alert const* a = wait_for_alert(ses, read_piece_alert::alert_type, "read_piece_alert");
|
||||||
|
TEST_CHECK(a);
|
||||||
|
if (auto* rp = alert_cast<read_piece_alert>(a))
|
||||||
|
{
|
||||||
|
TEST_CHECK(rp->error == error_code(lt::errors::invalid_piece_index
|
||||||
|
, lt::libtorrent_category()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue