| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 | 
							- 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(-)
 
- --- 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];
 
-  
 
 
  |