linux: fix up SO_REUSEPORT back-port
Commit 3d2c820 back-ports a patch from the master branch that disables
the use of SO_REUSEPORT on Linux for reasons mentioned in the commit
log.
Unfortunately, the back-port was incomplete; another setsockopt() call
site in src/unix/udp.c was overlooked. This commit rectifies that.
Hat tip to Luca Bruno for helping troubleshoot the issue.
This commit is contained in:
parent
c3e05bafa5
commit
74457d08ba
@ -491,7 +491,7 @@ int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags) {
|
|||||||
int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
|
int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
|
||||||
int saved_errno;
|
int saved_errno;
|
||||||
int status;
|
int status;
|
||||||
int yes;
|
int err;
|
||||||
|
|
||||||
saved_errno = errno;
|
saved_errno = errno;
|
||||||
status = -1;
|
status = -1;
|
||||||
@ -502,28 +502,12 @@ int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
yes = 1;
|
err = uv__set_reuse(sock);
|
||||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) == -1) {
|
if (err) {
|
||||||
uv__set_sys_error(handle->loop, errno);
|
uv__set_sys_error(handle->loop, -err);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* On the BSDs, SO_REUSEADDR lets you reuse an address that's in the TIME_WAIT
|
|
||||||
* state (i.e. was until recently tied to a socket) while SO_REUSEPORT lets
|
|
||||||
* multiple processes bind to the same address. Yes, it's something of a
|
|
||||||
* misnomer but then again, SO_REUSEADDR was already taken.
|
|
||||||
*
|
|
||||||
* None of the above applies to Linux: SO_REUSEADDR implies SO_REUSEPORT on
|
|
||||||
* Linux and hence it does not have SO_REUSEPORT at all.
|
|
||||||
*/
|
|
||||||
#ifdef SO_REUSEPORT
|
|
||||||
yes = 1;
|
|
||||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof yes) == -1) {
|
|
||||||
uv__set_sys_error(handle->loop, errno);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
handle->io_watcher.fd = sock;
|
handle->io_watcher.fd = sock;
|
||||||
status = 0;
|
status = 0;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user