fix announcing port=0 when configured with no listen interfaces

This commit is contained in:
arvidn 2020-02-06 02:05:37 +01:00 committed by Arvid Norberg
parent d607328b45
commit b4cda2989e
2 changed files with 21 additions and 12 deletions

View File

@ -549,14 +549,14 @@ TORRENT_TEST(announce_no_listen)
{ {
// if we don't listen on any sockets at all (but only make outgoing peer // if we don't listen on any sockets at all (but only make outgoing peer
// connections) we still need to make sure we announce to trackers // connections) we still need to make sure we announce to trackers
test_ipv6_support("", 2, 2); test_ipv6_support("", num_interfaces * 2, num_interfaces * 2);
} }
TORRENT_TEST(announce_udp_no_listen) TORRENT_TEST(announce_udp_no_listen)
{ {
// since there's no actual udp tracker in this test, we will only try to // since there's no actual udp tracker in this test, we will only try to
// announce once, and fail. We won't announce the event=stopped // announce once, and fail. We won't announce the event=stopped
test_udpv6_support("", 1, 1); test_udpv6_support("", num_interfaces * 1, num_interfaces * 1);
} }
TORRENT_TEST(ipv6_support_bind_v4_v6_any) TORRENT_TEST(ipv6_support_bind_v4_v6_any)

View File

@ -1097,6 +1097,7 @@ namespace aux {
void session_impl::queue_tracker_request(tracker_request&& req void session_impl::queue_tracker_request(tracker_request&& req
, std::weak_ptr<request_callback> c) , std::weak_ptr<request_callback> c)
{ {
req.listen_port = 0;
#if TORRENT_USE_I2P #if TORRENT_USE_I2P
if (!m_settings.get_str(settings_pack::i2p_hostname).empty()) if (!m_settings.get_str(settings_pack::i2p_hostname).empty())
{ {
@ -1125,6 +1126,7 @@ namespace aux {
{ {
for (auto& ls : m_listen_sockets) for (auto& ls : m_listen_sockets)
{ {
if (!(ls->flags & listen_socket_t::accept_incoming)) continue;
#ifdef TORRENT_USE_OPENSSL #ifdef TORRENT_USE_OPENSSL
if ((ls->ssl == transport::ssl) != use_ssl) continue; if ((ls->ssl == transport::ssl) != use_ssl) continue;
#endif #endif
@ -1833,14 +1835,6 @@ namespace aux {
interface_to_endpoints(device, port, ssl, flags, eps); interface_to_endpoints(device, port, ssl, flags, eps);
} }
std::vector<ip_interface> const ifs = enum_net_interfaces(m_io_service, ec);
if (!ec)
{
expand_unspecified_address(ifs, eps);
auto const routes = enum_routes(m_io_service, ec);
if (!ec) expand_devices(ifs, routes, eps);
}
// if no listen interfaces are specified, create sockets to use // if no listen interfaces are specified, create sockets to use
// any interface // any interface
if (eps.empty()) if (eps.empty())
@ -1851,6 +1845,14 @@ namespace aux {
, listen_socket_flags_t{}); , listen_socket_flags_t{});
} }
std::vector<ip_interface> const ifs = enum_net_interfaces(m_io_service, ec);
if (!ec)
{
expand_unspecified_address(ifs, eps);
auto const routes = enum_routes(m_io_service, ec);
if (!ec) expand_devices(ifs, routes, eps);
}
auto remove_iter = partition_listen_sockets(eps, m_listen_sockets); auto remove_iter = partition_listen_sockets(eps, m_listen_sockets);
while (remove_iter != m_listen_sockets.end()) while (remove_iter != m_listen_sockets.end())
@ -5341,6 +5343,7 @@ namespace aux {
if (m_listen_sockets.empty()) return 0; if (m_listen_sockets.empty()) return 0;
if (sock) if (sock)
{ {
if (!(sock->flags & listen_socket_t::accept_incoming)) return 0;
// if we're using a proxy, we won't be able to accept any TCP // if we're using a proxy, we won't be able to accept any TCP
// connections. We may be able to accept uTP connections though, so // connections. We may be able to accept uTP connections though, so
// announce the UDP port instead // announce the UDP port instead
@ -5353,6 +5356,7 @@ namespace aux {
#ifdef TORRENT_USE_OPENSSL #ifdef TORRENT_USE_OPENSSL
for (auto const& s : m_listen_sockets) for (auto const& s : m_listen_sockets)
{ {
if (!(s->flags & listen_socket_t::accept_incoming)) continue;
if (s->ssl == transport::plaintext) if (s->ssl == transport::plaintext)
{ {
if (m_settings.get_int(settings_pack::proxy_type) != settings_pack::none) if (m_settings.get_int(settings_pack::proxy_type) != settings_pack::none)
@ -5363,7 +5367,9 @@ namespace aux {
} }
return 0; return 0;
#else #else
return std::uint16_t(m_listen_sockets.front()->tcp_external_port()); sock = m_listen_sockets.front().get();
if (!(sock->flags & listen_socket_t::accept_incoming)) return 0;
return std::uint16_t(sock->tcp_external_port());
#endif #endif
} }
@ -5377,9 +5383,10 @@ namespace aux {
std::uint16_t session_impl::ssl_listen_port(listen_socket_t* sock) const std::uint16_t session_impl::ssl_listen_port(listen_socket_t* sock) const
{ {
#ifdef TORRENT_USE_OPENSSL #ifdef TORRENT_USE_OPENSSL
if (sock) if (sock)
{ {
if (!(sock->flags & listen_socket_t::accept_incoming)) return 0;
// if we're using a proxy, we won't be able to accept any TCP // if we're using a proxy, we won't be able to accept any TCP
// connections. We may be able to accept uTP connections though, so // connections. We may be able to accept uTP connections though, so
// announce the UDP port instead // announce the UDP port instead
@ -5394,6 +5401,7 @@ namespace aux {
for (auto const& s : m_listen_sockets) for (auto const& s : m_listen_sockets)
{ {
if (!(s->flags & listen_socket_t::accept_incoming)) continue;
if (s->ssl == transport::ssl) if (s->ssl == transport::ssl)
{ {
if (m_settings.get_int(settings_pack::proxy_type) != settings_pack::none) if (m_settings.get_int(settings_pack::proxy_type) != settings_pack::none)
@ -5431,6 +5439,7 @@ namespace aux {
auto socket = std::find_if(m_listen_sockets.begin(), m_listen_sockets.end() auto socket = std::find_if(m_listen_sockets.begin(), m_listen_sockets.end()
, [&](std::shared_ptr<listen_socket_t> const& e) , [&](std::shared_ptr<listen_socket_t> const& e)
{ {
if (!(e->flags & listen_socket_t::accept_incoming)) return false;
auto const& listen_addr = e->external_address.external_address(); auto const& listen_addr = e->external_address.external_address();
return e->ssl == ssl return e->ssl == ssl
&& (listen_addr == local_addr && (listen_addr == local_addr