1 https://bugs.gentoo.org/946389
2 https://github.com/randombit/botan/pull/4484
4 From 2a406beab449a2cb310fa543451a7087ca7b4b1a Mon Sep 17 00:00:00 2001
5 From: q66 <q66@chimera-linux.org>
6 Date: Sun, 15 Dec 2024 02:42:02 +0100
7 Subject: [PATCH 1/2] Remove usage of deprecated asio API
9 These were all finally dropped with boost 1.87, so this fixes
10 build with boost 1.87.
11 --- a/src/cli/tls_proxy.cpp
12 +++ b/src/cli/tls_proxy.cpp
13 @@ -106,11 +106,11 @@ class tls_proxy_session final : public std::enable_shared_from_this<tls_proxy_se
15 typedef std::shared_ptr<tls_proxy_session> pointer;
17 - static pointer create(boost::asio::io_service& io,
18 + static pointer create(boost::asio::io_context& io,
19 const std::shared_ptr<Botan::TLS::Session_Manager>& session_manager,
20 const std::shared_ptr<Botan::Credentials_Manager>& credentials,
21 const std::shared_ptr<Botan::TLS::Policy>& policy,
22 - const tcp::resolver::iterator& endpoints) {
23 + const tcp::resolver::results_type& endpoints) {
24 auto session = std::make_shared<tls_proxy_session>(io, endpoints);
26 // Defer the setup of the TLS server to make use of
27 @@ -144,7 +144,7 @@ class tls_proxy_session final : public std::enable_shared_from_this<tls_proxy_se
31 - tls_proxy_session(boost::asio::io_service& io, tcp::resolver::iterator endpoints) :
32 + tls_proxy_session(boost::asio::io_context& io, tcp::resolver::results_type endpoints) :
34 m_server_endpoints(std::move(endpoints)),
36 @@ -287,7 +287,7 @@ class tls_proxy_session final : public std::enable_shared_from_this<tls_proxy_se
38 void tls_session_activated() override {
39 auto onConnect = [self = weak_from_this()](boost::system::error_code ec,
40 - const tcp::resolver::iterator& /*endpoint*/) {
41 + tcp::resolver::results_type::iterator /*endpoint*/) {
43 log_error("Server connection", ec);
45 @@ -301,7 +301,7 @@ class tls_proxy_session final : public std::enable_shared_from_this<tls_proxy_se
49 - async_connect(m_server_socket, m_server_endpoints, onConnect);
50 + async_connect(m_server_socket, m_server_endpoints.begin(), m_server_endpoints.end(), onConnect);
53 void tls_session_established(const Botan::TLS::Session_Summary& session) override {
54 @@ -315,9 +315,9 @@ class tls_proxy_session final : public std::enable_shared_from_this<tls_proxy_se
58 - boost::asio::io_service::strand m_strand;
59 + boost::asio::io_context::strand m_strand;
61 - tcp::resolver::iterator m_server_endpoints;
62 + tcp::resolver::results_type m_server_endpoints;
64 tcp::socket m_client_socket;
65 tcp::socket m_server_socket;
66 @@ -341,9 +341,9 @@ class tls_proxy_server final {
68 typedef tls_proxy_session session;
70 - tls_proxy_server(boost::asio::io_service& io,
71 + tls_proxy_server(boost::asio::io_context& io,
73 - tcp::resolver::iterator endpoints,
74 + tcp::resolver::results_type endpoints,
75 std::shared_ptr<Botan::Credentials_Manager> creds,
76 std::shared_ptr<Botan::TLS::Policy> policy,
77 std::shared_ptr<Botan::TLS::Session_Manager> session_mgr,
78 @@ -383,7 +383,7 @@ class tls_proxy_server final {
81 tcp::acceptor m_acceptor;
82 - tcp::resolver::iterator m_server_endpoints;
83 + tcp::resolver::results_type m_server_endpoints;
85 std::shared_ptr<Botan::Credentials_Manager> m_creds;
86 std::shared_ptr<Botan::TLS::Policy> m_policy;
87 @@ -429,10 +429,10 @@ class TLS_Proxy final : public Command {
89 auto policy = load_tls_policy(get_arg("policy"));
91 - boost::asio::io_service io;
92 + boost::asio::io_context io;
94 tcp::resolver resolver(io);
95 - auto server_endpoint_iterator = resolver.resolve({target, target_port});
96 + auto server_endpoint_iterator = resolver.resolve(target, target_port);
98 std::shared_ptr<Botan::TLS::Session_Manager> session_mgr;
100 --- a/src/lib/utils/socket/socket.cpp
101 +++ b/src/lib/utils/socket/socket.cpp
102 @@ -46,20 +46,19 @@ class Asio_Socket final : public OS::Socket {
104 Asio_Socket(std::string_view hostname, std::string_view service, std::chrono::milliseconds timeout) :
105 m_timeout(timeout), m_timer(m_io), m_tcp(m_io) {
106 - m_timer.expires_from_now(m_timeout);
107 + m_timer.expires_after(m_timeout);
110 boost::asio::ip::tcp::resolver resolver(m_io);
111 - boost::asio::ip::tcp::resolver::query query(std::string{hostname}, std::string{service});
112 - boost::asio::ip::tcp::resolver::iterator dns_iter = resolver.resolve(query);
113 + boost::asio::ip::tcp::resolver::results_type dns_iter = resolver.resolve(std::string{hostname}, std::string{service});
115 boost::system::error_code ec = boost::asio::error::would_block;
117 - auto connect_cb = [&ec](const boost::system::error_code& e, const boost::asio::ip::tcp::resolver::iterator&) {
118 + auto connect_cb = [&ec](const boost::system::error_code& e, boost::asio::ip::tcp::resolver::results_type::iterator) {
122 - boost::asio::async_connect(m_tcp, dns_iter, connect_cb);
123 + boost::asio::async_connect(m_tcp, dns_iter.begin(), dns_iter.end(), connect_cb);
125 while(ec == boost::asio::error::would_block) {
127 @@ -74,7 +73,7 @@ class Asio_Socket final : public OS::Socket {
130 void write(const uint8_t buf[], size_t len) override {
131 - m_timer.expires_from_now(m_timeout);
132 + m_timer.expires_after(m_timeout);
134 boost::system::error_code ec = boost::asio::error::would_block;
136 @@ -90,7 +89,7 @@ class Asio_Socket final : public OS::Socket {
139 size_t read(uint8_t buf[], size_t len) override {
140 - m_timer.expires_from_now(m_timeout);
141 + m_timer.expires_after(m_timeout);
143 boost::system::error_code ec = boost::asio::error::would_block;
145 @@ -116,7 +115,7 @@ class Asio_Socket final : public OS::Socket {
148 void check_timeout() {
149 - if(m_tcp.is_open() && m_timer.expires_at() < std::chrono::system_clock::now()) {
150 + if(m_tcp.is_open() && m_timer.expiry() < std::chrono::system_clock::now()) {
151 boost::system::error_code err;
153 // NOLINTNEXTLINE(bugprone-unused-return-value,cert-err33-c)
154 @@ -127,7 +126,7 @@ class Asio_Socket final : public OS::Socket {
157 const std::chrono::milliseconds m_timeout;
158 - boost::asio::io_service m_io;
159 + boost::asio::io_context m_io;
160 boost::asio::system_timer m_timer;
161 boost::asio::ip::tcp::socket m_tcp;
163 --- a/src/lib/utils/socket/socket_udp.cpp
164 +++ b/src/lib/utils/socket/socket_udp.cpp
165 @@ -46,20 +46,19 @@ class Asio_SocketUDP final : public OS::SocketUDP {
167 Asio_SocketUDP(std::string_view hostname, std::string_view service, std::chrono::microseconds timeout) :
168 m_timeout(timeout), m_timer(m_io), m_udp(m_io) {
169 - m_timer.expires_from_now(m_timeout);
170 + m_timer.expires_after(m_timeout);
173 boost::asio::ip::udp::resolver resolver(m_io);
174 - boost::asio::ip::udp::resolver::query query(std::string{hostname}, std::string{service});
175 - boost::asio::ip::udp::resolver::iterator dns_iter = resolver.resolve(query);
176 + boost::asio::ip::udp::resolver::results_type dns_iter = resolver.resolve(std::string{hostname}, std::string{service});
178 boost::system::error_code ec = boost::asio::error::would_block;
180 - auto connect_cb = [&ec](const boost::system::error_code& e, const boost::asio::ip::udp::resolver::iterator&) {
181 + auto connect_cb = [&ec](const boost::system::error_code& e, boost::asio::ip::udp::resolver::results_type::iterator) {
185 - boost::asio::async_connect(m_udp, dns_iter, connect_cb);
186 + boost::asio::async_connect(m_udp, dns_iter.begin(), dns_iter.end(), connect_cb);
188 while(ec == boost::asio::error::would_block) {
190 @@ -74,7 +73,7 @@ class Asio_SocketUDP final : public OS::SocketUDP {
193 void write(const uint8_t buf[], size_t len) override {
194 - m_timer.expires_from_now(m_timeout);
195 + m_timer.expires_after(m_timeout);
197 boost::system::error_code ec = boost::asio::error::would_block;
199 @@ -90,7 +89,7 @@ class Asio_SocketUDP final : public OS::SocketUDP {
202 size_t read(uint8_t buf[], size_t len) override {
203 - m_timer.expires_from_now(m_timeout);
204 + m_timer.expires_after(m_timeout);
206 boost::system::error_code ec = boost::asio::error::would_block;
208 @@ -116,7 +115,7 @@ class Asio_SocketUDP final : public OS::SocketUDP {
211 void check_timeout() {
212 - if(m_udp.is_open() && m_timer.expires_at() < std::chrono::system_clock::now()) {
213 + if(m_udp.is_open() && m_timer.expiry() < std::chrono::system_clock::now()) {
214 boost::system::error_code err;
216 // NOLINTNEXTLINE(bugprone-unused-return-value,cert-err33-c)
217 @@ -127,7 +126,7 @@ class Asio_SocketUDP final : public OS::SocketUDP {
220 const std::chrono::microseconds m_timeout;
221 - boost::asio::io_service m_io;
222 + boost::asio::io_context m_io;
223 boost::asio::system_timer m_timer;
224 boost::asio::ip::udp::socket m_udp;
227 From 3820f357017eacef1fcb5119582bc9789b88f6c2 Mon Sep 17 00:00:00 2001
228 From: Jack Lloyd <jack@randombit.net>
229 Date: Wed, 18 Dec 2024 17:10:34 -0500
230 Subject: [PATCH 2/2] Address review comments
232 --- a/src/cli/tls_proxy.cpp
233 +++ b/src/cli/tls_proxy.cpp
234 @@ -287,7 +287,7 @@ class tls_proxy_session final : public std::enable_shared_from_this<tls_proxy_se
236 void tls_session_activated() override {
237 auto onConnect = [self = weak_from_this()](boost::system::error_code ec,
238 - tcp::resolver::results_type::iterator /*endpoint*/) {
239 + const tcp::resolver::results_type::iterator& /*endpoint*/) {
241 log_error("Server connection", ec);
243 --- a/src/examples/tls_stream_client.cpp
244 +++ b/src/examples/tls_stream_client.cpp
245 @@ -35,7 +35,7 @@ class Credentials_Manager : public Botan::Credentials_Manager {
248 client(boost::asio::io_context& io_context,
249 - boost::asio::ip::tcp::resolver::iterator endpoint_iterator,
250 + const boost::asio::ip::tcp::resolver::results_type& endpoints,
251 std::string_view host,
252 const http::request<http::string_body>& req) :
254 @@ -46,7 +46,8 @@ class client {
256 m_stream(io_context, m_ctx) {
257 boost::asio::async_connect(m_stream.lowest_layer(),
258 - std::move(endpoint_iterator),
261 boost::bind(&client::handle_connect, this, ap::error));
264 @@ -111,8 +112,7 @@ int main(int argc, char* argv[]) {
265 boost::asio::io_context io_context;
267 boost::asio::ip::tcp::resolver resolver(io_context);
268 - boost::asio::ip::tcp::resolver::query query(host, port);
269 - boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
270 + boost::asio::ip::tcp::resolver::results_type endpoints = resolver.resolve(host, port);
272 http::request<http::string_body> req;
274 @@ -121,7 +121,7 @@ int main(int argc, char* argv[]) {
275 req.set(http::field::host, host);
276 req.set(http::field::user_agent, Botan::version_string());
278 - client c(io_context, iterator, host, req);
279 + client c(io_context, endpoints, host, req);
282 } catch(std::exception& e) {
283 --- a/src/lib/utils/socket/socket.cpp
284 +++ b/src/lib/utils/socket/socket.cpp
285 @@ -50,13 +50,12 @@ class Asio_Socket final : public OS::Socket {
288 boost::asio::ip::tcp::resolver resolver(m_io);
289 - boost::asio::ip::tcp::resolver::results_type dns_iter = resolver.resolve(std::string{hostname}, std::string{service});
290 + boost::asio::ip::tcp::resolver::results_type dns_iter =
291 + resolver.resolve(std::string{hostname}, std::string{service});
293 boost::system::error_code ec = boost::asio::error::would_block;
295 - auto connect_cb = [&ec](const boost::system::error_code& e, boost::asio::ip::tcp::resolver::results_type::iterator) {
298 + auto connect_cb = [&ec](const boost::system::error_code& e, const auto&) { ec = e; };
300 boost::asio::async_connect(m_tcp, dns_iter.begin(), dns_iter.end(), connect_cb);
302 --- a/src/lib/utils/socket/socket_udp.cpp
303 +++ b/src/lib/utils/socket/socket_udp.cpp
304 @@ -50,13 +50,13 @@ class Asio_SocketUDP final : public OS::SocketUDP {
307 boost::asio::ip::udp::resolver resolver(m_io);
308 - boost::asio::ip::udp::resolver::results_type dns_iter = resolver.resolve(std::string{hostname}, std::string{service});
309 + boost::asio::ip::udp::resolver::results_type dns_iter =
310 + resolver.resolve(std::string{hostname}, std::string{service});
312 boost::system::error_code ec = boost::asio::error::would_block;
314 - auto connect_cb = [&ec](const boost::system::error_code& e, boost::asio::ip::udp::resolver::results_type::iterator) {
317 + auto connect_cb = [&ec](const boost::system::error_code& e,
318 + const boost::asio::ip::udp::resolver::results_type::iterator&) { ec = e; };
320 boost::asio::async_connect(m_udp, dns_iter.begin(), dns_iter.end(), connect_cb);