Trigger OOS on bind failures (fixes #40597)

This commit is contained in:
Alex Xu (Hello71) 2022-05-21 15:52:31 -04:00
parent 4f038d224f
commit 87b2ce6f84
2 changed files with 19 additions and 9 deletions

4
changes/issue40597 Normal file
View File

@ -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).

View File

@ -2224,21 +2224,27 @@ connection_connect_sockaddr,(connection_t *conn,
tor_socket_strerror(errno)); 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) { if (bindaddr && bind(s, bindaddr, bindaddr_len) < 0) {
*socket_error = tor_socket_errno(s); *socket_error = tor_socket_errno(s);
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", log_warn(LD_NET,"Error binding network socket: %s",
tor_socket_strerror(*socket_error)); tor_socket_strerror(*socket_error));
connection_check_oos(get_n_open_sockets(), 0);
}
tor_close_socket(s); tor_close_socket(s);
return -1; 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); tor_assert(options);
if (options->ConstrainedSockets) if (options->ConstrainedSockets)
set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize); set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize);