From 8be7a7cb00b9540e9be05d409191b0bc1ba424f0 Mon Sep 17 00:00:00 2001 From: notsure2 Date: Mon, 11 Dec 2023 09:15:47 +0200 Subject: [PATCH] Fix mishandling of incoming socket buffer. It must be set on the listening socket not the accepted socket. --- src/local.c | 16 ++++++++-------- src/redir.c | 16 ++++++++-------- src/server.c | 16 ++++++++-------- src/tunnel.c | 16 ++++++++-------- 4 files changed, 32 insertions(+), 32 deletions(-) --- a/src/local.c +++ b/src/local.c @@ -205,6 +205,14 @@ create_and_bind(const char *addr, const } } + if (tcp_incoming_sndbuf > 0) { + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int)); + } + + if (tcp_incoming_rcvbuf > 0) { + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int)); + } + s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen); if (s == 0) { /* We managed to bind successfully! */ @@ -1406,14 +1414,6 @@ accept_cb(EV_P_ ev_io *w, int revents) setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif - if (tcp_incoming_sndbuf > 0) { - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int)); - } - - if (tcp_incoming_rcvbuf > 0) { - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int)); - } - server_t *server = new_server(serverfd); server->listener = listener; --- a/src/redir.c +++ b/src/redir.c @@ -201,6 +201,14 @@ create_and_bind(const char *addr, const LOGI("tcp tproxy mode enabled"); } + if (tcp_incoming_sndbuf > 0) { + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int)); + } + + if (tcp_incoming_rcvbuf > 0) { + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int)); + } + s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen); if (s == 0) { /* We managed to bind successfully! */ @@ -759,14 +767,6 @@ accept_cb(EV_P_ ev_io *w, int revents) setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif - if (tcp_incoming_sndbuf > 0) { - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int)); - } - - if (tcp_incoming_rcvbuf > 0) { - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int)); - } - int index = rand() % listener->remote_num; struct sockaddr *remote_addr = listener->remote_addr[index]; --- a/src/server.c +++ b/src/server.c @@ -620,6 +620,14 @@ create_and_bind(const char *host, const } } + if (tcp_incoming_sndbuf > 0) { + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int)); + } + + if (tcp_incoming_rcvbuf > 0) { + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int)); + } + // Enable out-of-tree mptcp if (mptcp == 1) { int i = 0; @@ -1769,14 +1777,6 @@ accept_cb(EV_P_ ev_io *w, int revents) setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif - if (tcp_incoming_sndbuf > 0) { - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int)); - } - - if (tcp_incoming_rcvbuf > 0) { - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int)); - } - setnonblocking(serverfd); server_t *server = new_server(serverfd, listener); --- a/src/tunnel.c +++ b/src/tunnel.c @@ -166,6 +166,14 @@ create_and_bind(const char *addr, const } } + if (tcp_incoming_sndbuf > 0) { + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int)); + } + + if (tcp_incoming_rcvbuf > 0) { + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int)); + } + s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen); if (s == 0) { /* We managed to bind successfully! */ @@ -725,14 +733,6 @@ accept_cb(EV_P_ ev_io *w, int revents) setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)); #endif - if (tcp_incoming_sndbuf > 0) { - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int)); - } - - if (tcp_incoming_rcvbuf > 0) { - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int)); - } - int index = rand() % listener->remote_num; struct sockaddr *remote_addr = listener->remote_addr[index];