From 95a11805e0110ce5a3afa09751f39f7c793716fb Mon Sep 17 00:00:00 2001 From: Lu jicong Date: Sun, 19 Jan 2025 19:20:47 +0800 Subject: [PATCH] shadowsocks-libev: backport not merged fix There is a not merged pull request for bug fixing --- ...of-incoming-socket-buffer.-It-must-b.patch | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 shadowsocks-libev/patches/101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch diff --git a/shadowsocks-libev/patches/101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch b/shadowsocks-libev/patches/101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch new file mode 100644 index 0000000..6dc1c56 --- /dev/null +++ b/shadowsocks-libev/patches/101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch @@ -0,0 +1,152 @@ +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(-) + +diff --git a/src/local.c b/src/local.c +index fa1ca7b..51f62c4 100644 +--- a/src/local.c ++++ b/src/local.c +@@ -205,6 +205,14 @@ create_and_bind(const char *addr, const char *port) + } + } + ++ 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; + +diff --git a/src/redir.c b/src/redir.c +index d36fe3f..86b7238 100644 +--- a/src/redir.c ++++ b/src/redir.c +@@ -201,6 +201,14 @@ create_and_bind(const char *addr, const char *port) + 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]; + +diff --git a/src/server.c b/src/server.c +index 73b6599..ef347a5 100644 +--- a/src/server.c ++++ b/src/server.c +@@ -620,6 +620,14 @@ create_and_bind(const char *host, const char *port, int mptcp) + } + } + ++ 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); +diff --git a/src/tunnel.c b/src/tunnel.c +index 99ed412..9f0dd57 100644 +--- a/src/tunnel.c ++++ b/src/tunnel.c +@@ -166,6 +166,14 @@ create_and_bind(const char *addr, const char *port) + } + } + ++ 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]; + +-- +2.39.5 +