fix traversal algorithm leak in DHT

This commit is contained in:
Arvid Norberg 2013-01-22 02:04:58 +00:00
parent d6fecf4c34
commit 29c17c123e
4 changed files with 21 additions and 5 deletions

View File

@ -10,6 +10,7 @@
* fix uTP edge case where udp socket buffer fills up * fix uTP edge case where udp socket buffer fills up
* fix nagle implementation in uTP * fix nagle implementation in uTP
* fix traversal algorithm leak in DHT
* fix string encoding conversions on windows * fix string encoding conversions on windows
* take torrent_handle::query_pieces into account in torrent_handle::statue() * take torrent_handle::query_pieces into account in torrent_handle::statue()
* honor trackers responding with 410 * honor trackers responding with 410

View File

@ -75,8 +75,7 @@ bool refresh::invoke(observer_ptr o)
e["q"] = "find_node"; e["q"] = "find_node";
entry& a = e["a"]; entry& a = e["a"];
a["target"] = target().to_string(); a["target"] = target().to_string();
m_node.m_rpc.invoke(e, o->target_ep(), o); return m_node.m_rpc.invoke(e, o->target_ep(), o);
return true;
} }
bootstrap::bootstrap( bootstrap::bootstrap(

View File

@ -393,6 +393,16 @@ time_duration rpc_manager::tick()
time_duration ret = seconds(short_timeout); time_duration ret = seconds(short_timeout);
ptime now = time_now(); ptime now = time_now();
#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS
ptime last = min_time();
for (transactions_t::iterator i = m_transactions.begin();
i != m_transactions.end(); ++i)
{
TORRENT_ASSERT((*i)->sent() > last);
last = (*i)->sent();
}
#endif
for (transactions_t::iterator i = m_transactions.begin(); for (transactions_t::iterator i = m_transactions.begin();
i != m_transactions.end();) i != m_transactions.end();)
{ {
@ -483,8 +493,9 @@ bool rpc_manager::invoke(entry& e, udp::endpoint target_addr
#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS #if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS
o->m_was_sent = true; o->m_was_sent = true;
#endif #endif
return true;
} }
return true; return false;
} }
observer::~observer() observer::~observer()

View File

@ -177,7 +177,8 @@ void traversal_algorithm::start()
// router nodes in the table // router nodes in the table
if (m_results.empty()) add_router_entries(); if (m_results.empty()) add_router_entries();
init(); init();
add_requests(); bool is_done = add_requests();
if (is_done) done();
} }
void* traversal_algorithm::allocate_observer() void* traversal_algorithm::allocate_observer()
@ -383,13 +384,17 @@ bool traversal_algorithm::add_requests()
; ;
#endif #endif
o->flags |= observer::flag_queried;
if (invoke(*i)) if (invoke(*i))
{ {
TORRENT_ASSERT(m_invoke_count >= 0); TORRENT_ASSERT(m_invoke_count >= 0);
++m_invoke_count; ++m_invoke_count;
o->flags |= observer::flag_queried;
++outstanding; ++outstanding;
} }
else
{
o->flags |= observer::flag_failed;
}
} }
// this is the completion condition. If we found m_num_target_nodes // this is the completion condition. If we found m_num_target_nodes