tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit 87b2ce6f848ec3a65a7a06ef1edce5a0652ad9a3
parent 4f038d224f5a3df5fb396eff0173bba0eec89127
Author: Alex Xu (Hello71) <alex_y_xu@yahoo.ca>
Date:   Sat, 21 May 2022 15:52:31 -0400

Trigger OOS on bind failures (fixes #40597)

Diffstat:
Achanges/issue40597 | 4++++
Msrc/core/mainloop/connection.c | 24+++++++++++++++---------
2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/changes/issue40597 b/changes/issue40597 @@ -0,0 +1,4 @@ + o Minor features (relays): + - Trigger OOS when bind fails with EADDRINUSE. This improves fairness when + a large number of exit connections are requested, and properly signals + exhaustion to the network. Fixes issue 40597; patch by Alex Xu (Hello71). diff --git a/src/core/mainloop/connection.c b/src/core/mainloop/connection.c @@ -2224,21 +2224,27 @@ connection_connect_sockaddr,(connection_t *conn, tor_socket_strerror(errno)); } - /* - * We've got the socket open; give the OOS handler a chance to check - * against configured maximum socket number, but tell it no exhaustion - * failure. - */ - connection_check_oos(get_n_open_sockets(), 0); - if (bindaddr && bind(s, bindaddr, bindaddr_len) < 0) { *socket_error = tor_socket_errno(s); - log_warn(LD_NET,"Error binding network socket: %s", - tor_socket_strerror(*socket_error)); + if (ERRNO_IS_EADDRINUSE(*socket_error)) { + socket_failed_from_resource_exhaustion(); + connection_check_oos(get_n_open_sockets(), 1); + } else { + log_warn(LD_NET,"Error binding network socket: %s", + tor_socket_strerror(*socket_error)); + connection_check_oos(get_n_open_sockets(), 0); + } tor_close_socket(s); return -1; } + /* + * We've got the socket open and bound; give the OOS handler a chance to + * check against configured maximum socket number, but tell it no exhaustion + * failure. + */ + connection_check_oos(get_n_open_sockets(), 0); + tor_assert(options); if (options->ConstrainedSockets) set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize);