From 87b2ce6f848ec3a65a7a06ef1edce5a0652ad9a3 Mon Sep 17 00:00:00 2001 From: "Alex Xu (Hello71)" Date: Sat, 21 May 2022 15:52:31 -0400 Subject: [PATCH] Trigger OOS on bind failures (fixes #40597) --- changes/issue40597 | 4 ++++ src/core/mainloop/connection.c | 24 +++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 changes/issue40597 diff --git a/changes/issue40597 b/changes/issue40597 new file mode 100644 index 0000000000..db2220805e --- /dev/null +++ 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 index 9271a70914..75fc3c8918 100644 --- 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);