diff --git a/include/libtorrent/bandwidth_manager.hpp b/include/libtorrent/bandwidth_manager.hpp index b548603be..20344ebc5 100644 --- a/include/libtorrent/bandwidth_manager.hpp +++ b/include/libtorrent/bandwidth_manager.hpp @@ -153,7 +153,8 @@ struct bandwidth_manager m_queue.clear(); m_history.clear(); m_current_quota = 0; - m_history_timer.cancel(); + error_code ec; + m_history_timer.cancel(ec); } #ifndef NDEBUG diff --git a/include/libtorrent/ssl_stream.hpp b/include/libtorrent/ssl_stream.hpp index 363c819f6..c4deb1352 100644 --- a/include/libtorrent/ssl_stream.hpp +++ b/include/libtorrent/ssl_stream.hpp @@ -54,7 +54,8 @@ public: : m_context(io_service, asio::ssl::context::sslv23_client) , m_sock(io_service, m_context) { - m_context.set_verify_mode(asio::ssl::context::verify_none); + error_code ec; + m_context.set_verify_mode(asio::ssl::context::verify_none, ec); } typedef Stream next_layer_type; diff --git a/src/http_connection.cpp b/src/http_connection.cpp index 84b750fc9..a524f180d 100644 --- a/src/http_connection.cpp +++ b/src/http_connection.cpp @@ -206,7 +206,8 @@ void http_connection::on_connect_timeout() if (!m_endpoints.empty()) { - m_sock.close(); + error_code ec; + m_sock.close(ec); } else { @@ -227,8 +228,8 @@ void http_connection::on_timeout(boost::weak_ptr p { if (c->m_connection_ticket > -1 && !c->m_endpoints.empty()) { - c->m_sock.close(); error_code ec; + c->m_sock.close(ec); c->m_timer.expires_at(c->m_last_receive + c->m_timeout, ec); c->m_timer.async_wait(bind(&http_connection::on_timeout, p, _1)); } @@ -322,7 +323,8 @@ void http_connection::on_connect(error_code const& e) else if (!m_endpoints.empty() && !m_abort) { // The connection failed. Try the next endpoint in the list. - m_sock.close(); + error_code ec; + m_sock.close(ec); queue_connect(); } else @@ -354,7 +356,8 @@ void http_connection::callback(error_code const& e, char const* data, int size) } } m_called = true; - m_timer.cancel(); + error_code ec; + m_timer.cancel(ec); if (m_handler) m_handler(e, m_parser, data, size, *this); } } diff --git a/src/http_tracker_connection.cpp b/src/http_tracker_connection.cpp index 6d7954966..099f1ee4c 100644 --- a/src/http_tracker_connection.cpp +++ b/src/http_tracker_connection.cpp @@ -157,8 +157,9 @@ namespace libtorrent if (m_settings.announce_ip != address()) { - url += "&ip="; - url += m_settings.announce_ip.to_string(); + error_code ec; + std::string ip = m_settings.announce_ip.to_string(ec); + if (!ec) url += "&ip=" + ip; } #ifndef TORRENT_DISABLE_ENCRYPTION @@ -382,7 +383,9 @@ namespace libtorrent peer_entry p; p.pid.clear(); - p.ip = detail::read_v4_address(i).to_string(); + error_code ec; + p.ip = detail::read_v4_address(i).to_string(ec); + if (ec) continue; p.port = detail::read_uint16(i); peer_list.push_back(p); } @@ -414,7 +417,9 @@ namespace libtorrent peer_entry p; p.pid.clear(); - p.ip = detail::read_v6_address(i).to_string(); + error_code ec; + p.ip = detail::read_v6_address(i).to_string(ec); + if (ec) continue; p.port = detail::read_uint16(i); peer_list.push_back(p); } diff --git a/src/kademlia/dht_tracker.cpp b/src/kademlia/dht_tracker.cpp index c4663bf22..3ef87d052 100644 --- a/src/kademlia/dht_tracker.cpp +++ b/src/kademlia/dht_tracker.cpp @@ -88,10 +88,12 @@ namespace void read_endpoint_list(libtorrent::entry const* n, std::vector& epl) { using namespace libtorrent; + if (n->type() != entry::list_t) return; entry::list_type const& contacts = n->list(); for (entry::list_type::const_iterator i = contacts.begin() , end(contacts.end()); i != end; ++i) { + if (i->type() != entry::string_t) return; std::string const& p = i->string(); if (p.size() < 6) continue; std::string::const_iterator in = p.begin(); @@ -192,14 +194,15 @@ namespace libtorrent { namespace dht m_dht.set_node_id(boost::lexical_cast(nid->string())); } - m_timer.expires_from_now(seconds(1)); + error_code ec; + m_timer.expires_from_now(seconds(1), ec); m_timer.async_wait(bind(&dht_tracker::tick, self(), _1)); - m_connection_timer.expires_from_now(seconds(10)); + m_connection_timer.expires_from_now(seconds(10), ec); m_connection_timer.async_wait( bind(&dht_tracker::connection_timeout, self(), _1)); - m_refresh_timer.expires_from_now(seconds(5)); + m_refresh_timer.expires_from_now(seconds(5), ec); m_refresh_timer.async_wait(bind(&dht_tracker::refresh_timeout, self(), _1)); m_dht.bootstrap(initial_nodes, bind(&dht_tracker::on_bootstrap, self())); @@ -209,9 +212,10 @@ namespace libtorrent { namespace dht { mutex_t::scoped_lock l(m_mutex); m_abort = true; - m_timer.cancel(); - m_connection_timer.cancel(); - m_refresh_timer.cancel(); + error_code ec; + m_timer.cancel(ec); + m_connection_timer.cancel(ec); + m_refresh_timer.cancel(ec); m_host_resolver.cancel(); } @@ -789,7 +793,6 @@ namespace libtorrent { namespace dht void write_nodes_entry(entry& r, libtorrent::dht::msg const& m) { bool ipv6_nodes = false; - r["nodes"] = entry(entry::string_t); entry& n = r["nodes"]; std::back_insert_iterator out(n.string()); for (msg::nodes_t::const_iterator i = m.nodes.begin() @@ -806,7 +809,6 @@ namespace libtorrent { namespace dht if (ipv6_nodes) { - r["nodes2"] = entry(entry::list_t); entry& p = r["nodes2"]; std::string endpoint; for (msg::nodes_t::const_iterator i = m.nodes.begin() diff --git a/src/kademlia/node.cpp b/src/kademlia/node.cpp index 3ce5a48a8..ce56d5006 100644 --- a/src/kademlia/node.cpp +++ b/src/kademlia/node.cpp @@ -126,7 +126,9 @@ bool node_impl::verify_token(msg const& m) } hasher h1; - std::string address = m.addr.address().to_string(); + error_code ec; + std::string address = m.addr.address().to_string(ec); + if (ec) return false; h1.update(&address[0], address.length()); h1.update((char*)&m_secret[0], sizeof(m_secret[0])); h1.update((char*)&m.info_hash[0], sha1_hash::size); @@ -150,7 +152,9 @@ entry node_impl::generate_token(msg const& m) std::string token; token.resize(4); hasher h; - std::string address = m.addr.address().to_string(); + error_code ec; + std::string address = m.addr.address().to_string(ec); + TORRENT_ASSERT(!ec); h.update(&address[0], address.length()); h.update((char*)&m_secret[0], sizeof(m_secret[0])); h.update((char*)&m.info_hash[0], sha1_hash::size); diff --git a/src/logger.cpp b/src/logger.cpp index 1ecba5045..944e559ae 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -211,8 +211,9 @@ namespace virtual boost::shared_ptr new_connection( peer_connection* pc) { + error_code ec; return boost::shared_ptr(new logger_peer_plugin( - pc->remote().address().to_string() + "_" + pc->remote().address().to_string(ec) + "_" + boost::lexical_cast(pc->remote().port()) + ".log")); } }; diff --git a/src/torrent.cpp b/src/torrent.cpp index abe28c0a3..99839531d 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -909,8 +909,9 @@ namespace libtorrent if (req.left == -1) req.left = 16*1024; req.event = e; tcp::endpoint ep = m_ses.get_ipv6_interface(); + error_code ec; if (ep != tcp::endpoint()) - req.ipv6 = ep.address().to_string(); + req.ipv6 = ep.address().to_string(ec); req.url = m_trackers[m_currently_trying_tracker].url; // if we are aborting. we don't want any new peers @@ -2402,9 +2403,15 @@ namespace libtorrent || p->in_handshake() || p->remote().address().is_v6()) return; - m_resolving_country = true; asio::ip::address_v4 reversed(swap_bytes(p->remote().address().to_v4().to_ulong())); - tcp::resolver::query q(reversed.to_string() + ".zz.countries.nerd.dk", "0"); + error_code ec; + tcp::resolver::query q(reversed.to_string(ec) + ".zz.countries.nerd.dk", "0"); + if (ec) + { + p->set_country("!!"); + return; + } + m_resolving_country = true; m_host_resolver.async_resolve(q, bind(&torrent::on_country_lookup, shared_from_this(), _1, _2, p)); } diff --git a/src/torrent_handle.cpp b/src/torrent_handle.cpp index be47b6299..cbcb9ad09 100644 --- a/src/torrent_handle.cpp +++ b/src/torrent_handle.cpp @@ -515,7 +515,7 @@ namespace libtorrent { INVARIANT_CHECK; #ifdef BOOST_NO_EXCEPTIONS - const static torrent_info empty; + const static torrent_info empty(sha1_hash(0)); #endif boost::shared_ptr t = m_torrent.lock(); if (!t) @@ -546,7 +546,7 @@ namespace libtorrent INVARIANT_CHECK; entry ret(entry::dictionary_t); - TORRENT_FORWARD(write_resume_data(ret)); + TORRENT_FORWARD_RETURN2(write_resume_data(ret), ret); t->filesystem().write_resume_data(ret); return ret;