浏览代码

shadowsocks-libev: backport not merged fix

There is a not merged pull request for bug fixing
Lu jicong 9 月之前
父节点
当前提交
6faf687620

+ 1 - 1
shadowsocks-libev/Makefile

@@ -14,7 +14,7 @@ include $(TOPDIR)/rules.mk
 #
 PKG_NAME:=shadowsocks-libev
 PKG_VERSION:=3.3.5
-PKG_RELEASE:=12
+PKG_RELEASE:=13
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz

+ 152 - 0
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 <[email protected]>
+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
+