mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-28 06:13:31 +01:00
Trigger OOS on bind failures (fixes #40597)
This commit is contained in:
parent
4f038d224f
commit
87b2ce6f84
4
changes/issue40597
Normal file
4
changes/issue40597
Normal 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).
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user