From 571952fd192fa9811e8df34cb1f1e36b8a453cbf Mon Sep 17 00:00:00 2001 From: arvidn Date: Mon, 13 Jan 2020 19:18:18 +0100 Subject: [PATCH] bind SOCKS5 connection to correct outgoing interface --- bindings/python/src/alert.cpp | 2 ++ include/libtorrent/operations.hpp | 3 +++ src/alert.cpp | 4 +++- src/udp_socket.cpp | 24 ++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/bindings/python/src/alert.cpp b/bindings/python/src/alert.cpp index 2809229de..64ae05839 100644 --- a/bindings/python/src/alert.cpp +++ b/bindings/python/src/alert.cpp @@ -370,6 +370,8 @@ void bind_alert() .value("partfile_write", operation_t::partfile_write) .value("hostname_lookup", operation_t::hostname_lookup) .value("symlink", operation_t::symlink) + .value("handshake", operation_t::handshake) + .value("sock_option", operation_t::sock_option) ; def("operation_name", static_cast(<::operation_name)); diff --git a/include/libtorrent/operations.hpp b/include/libtorrent/operations.hpp index 220c9957e..4847184e1 100644 --- a/include/libtorrent/operations.hpp +++ b/include/libtorrent/operations.hpp @@ -169,6 +169,9 @@ namespace libtorrent { // handshake with a peer or server handshake, + + // set socket option + sock_option, }; // maps an operation id (from peer_error_alert and peer_disconnected_alert) diff --git a/src/alert.cpp b/src/alert.cpp index a90e9165b..d5cd080b1 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -896,6 +896,7 @@ namespace { case o::hostname_lookup: return -1; case o::symlink: return -1; case o::handshake: return -1; + case o::sock_option: return -1; } return -1; } @@ -1562,7 +1563,8 @@ namespace { "partfile_write", "hostname_lookup", "symlink", - "handshake" + "handshake", + "sock_option" }; int const idx = static_cast(op); diff --git a/src/udp_socket.cpp b/src/udp_socket.cpp index 685d74660..bf61db858 100644 --- a/src/udp_socket.cpp +++ b/src/udp_socket.cpp @@ -556,9 +556,33 @@ void socks5::on_name_lookup(error_code const& e, tcp::resolver::iterator i) error_code ec; m_socks5_sock.open(is_v4(m_proxy_addr) ? tcp::v4() : tcp::v6(), ec); + if (ec) + { + if (m_alerts.should_post()) + m_alerts.emplace_alert(m_proxy_addr, operation_t::sock_open, ec); + return; + } // enable keepalives m_socks5_sock.set_option(boost::asio::socket_base::keep_alive(true), ec); + if (ec) + { + if (m_alerts.should_post()) + m_alerts.emplace_alert(m_proxy_addr, operation_t::sock_option, ec); + return; + } + + tcp::endpoint const bind_ep(m_listen_socket.get_local_endpoint().address(), 0); + m_socks5_sock.bind(bind_ep, ec); + if (ec) + { + if (m_alerts.should_post()) + m_alerts.emplace_alert(m_proxy_addr, operation_t::sock_bind, ec); + return; + } + + // TODO: perhaps an attempt should be made to bind m_socks5_sock to the + // device of m_listen_socket ADD_OUTSTANDING_ASYNC("socks5::on_connected"); m_socks5_sock.async_connect(m_proxy_addr