From 2e79c5e64895ba946fe8270293b3034406abce38 Mon Sep 17 00:00:00 2001 From: Steven Siloti Date: Mon, 10 Jul 2017 19:44:16 -0700 Subject: [PATCH] fix handling of SSL listen sockets --- include/libtorrent/aux_/session_impl.hpp | 3 +++ include/libtorrent/aux_/session_listen_socket.hpp | 2 ++ simulation/setup_dht.cpp | 2 ++ simulation/test_dht_rate_limit.cpp | 2 ++ src/kademlia/dht_tracker.cpp | 4 ++++ src/torrent.cpp | 2 ++ test/test_dht.cpp | 4 ++++ 7 files changed, 19 insertions(+) diff --git a/include/libtorrent/aux_/session_impl.hpp b/include/libtorrent/aux_/session_impl.hpp index 818f31424..947215d15 100644 --- a/include/libtorrent/aux_/session_impl.hpp +++ b/include/libtorrent/aux_/session_impl.hpp @@ -198,6 +198,9 @@ namespace aux { tcp::endpoint get_local_endpoint() override { return local_endpoint; } + bool is_ssl() override + { return ssl == transport::ssl; } + listen_socket_t(listen_socket_impl const& i) // NOLINT : listen_socket_impl(i) {} diff --git a/include/libtorrent/aux_/session_listen_socket.hpp b/include/libtorrent/aux_/session_listen_socket.hpp index 46bf9c978..f80b0c864 100644 --- a/include/libtorrent/aux_/session_listen_socket.hpp +++ b/include/libtorrent/aux_/session_listen_socket.hpp @@ -47,6 +47,8 @@ namespace libtorrent { namespace aux { virtual address get_external_address() = 0; virtual tcp::endpoint get_local_endpoint() = 0; + virtual bool is_ssl() = 0; + session_listen_socket() = default; protected: diff --git a/simulation/setup_dht.cpp b/simulation/setup_dht.cpp index 8b4f16185..ee54109ad 100644 --- a/simulation/setup_dht.cpp +++ b/simulation/setup_dht.cpp @@ -169,6 +169,8 @@ struct dht_node final : lt::dht::socket_manager, lt::aux::session_listen_socket return tcp::endpoint(address_v4(), 0); } + bool is_ssl() override { return false; } + // the node_id and IP address of this node std::pair node_info() const { diff --git a/simulation/test_dht_rate_limit.cpp b/simulation/test_dht_rate_limit.cpp index 99f1d13c4..2bb8f09de 100644 --- a/simulation/test_dht_rate_limit.cpp +++ b/simulation/test_dht_rate_limit.cpp @@ -95,6 +95,8 @@ struct mock_socket : lt::aux::session_listen_socket { return tcp::endpoint(address_v4::from_string("40.30.20.10"), 8888); } + + bool is_ssl() override { return false; } }; void send_packet(lt::udp_socket& sock, lt::aux::session_listen_socket*, udp::endpoint const& ep diff --git a/src/kademlia/dht_tracker.cpp b/src/kademlia/dht_tracker.cpp index cb25819c2..63c301145 100644 --- a/src/kademlia/dht_tracker.cpp +++ b/src/kademlia/dht_tracker.cpp @@ -116,6 +116,8 @@ namespace libtorrent { namespace dht { void dht_tracker::new_socket(aux::session_listen_socket* s) { + if (s->is_ssl()) return; + address local_address = s->get_local_endpoint().address(); #if TORRENT_USE_IPV6 // don't try to start dht nodes on non-global IPv6 addresses @@ -156,6 +158,8 @@ namespace libtorrent { namespace dht { void dht_tracker::delete_socket(aux::session_listen_socket* s) { + if (s->is_ssl()) return; + #if TORRENT_USE_IPV6 address local_address = s->get_local_endpoint().address(); // since we don't start nodes on local IPv6 interfaces we don't need to remove them either diff --git a/src/torrent.cpp b/src/torrent.cpp index 107b82721..3bcfbbed2 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -2700,6 +2700,8 @@ namespace libtorrent { // and removing entries for non-existent ones std::vector::size_type valid_endpoints = 0; m_ses.for_each_listen_socket([&](aux::session_listen_socket* s) { + if (s->is_ssl() != is_ssl_torrent()) + return; for (auto& aep : ae.endpoints) { if (aep.socket != s) continue; diff --git a/test/test_dht.cpp b/test/test_dht.cpp index f9cf1fcd8..38a27d487 100644 --- a/test/test_dht.cpp +++ b/test/test_dht.cpp @@ -131,6 +131,8 @@ struct mock_dht_socket final : aux::session_listen_socket address get_external_address() override { return m_external_address; } tcp::endpoint get_local_endpoint() override { return m_local_endpoint; } + bool is_ssl() override { return false; } + address m_external_address; tcp::endpoint m_local_endpoint; }; @@ -141,6 +143,8 @@ struct mock_dht_socket6 final : aux::session_listen_socket address get_external_address() override { return m_external_address; } tcp::endpoint get_local_endpoint() override { return m_local_endpoint; } + bool is_ssl() override { return false; } + address m_external_address = addr6("2002::1"); tcp::endpoint m_local_endpoint = tcp::endpoint(addr6("2002::1"), 6881); };