101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. From 8be7a7cb00b9540e9be05d409191b0bc1ba424f0 Mon Sep 17 00:00:00 2001
  2. From: notsure2 <[email protected]>
  3. Date: Mon, 11 Dec 2023 09:15:47 +0200
  4. Subject: [PATCH] Fix mishandling of incoming socket buffer. It must be set on
  5. the listening socket not the accepted socket.
  6. ---
  7. src/local.c | 16 ++++++++--------
  8. src/redir.c | 16 ++++++++--------
  9. src/server.c | 16 ++++++++--------
  10. src/tunnel.c | 16 ++++++++--------
  11. 4 files changed, 32 insertions(+), 32 deletions(-)
  12. diff --git a/src/local.c b/src/local.c
  13. index fa1ca7b..51f62c4 100644
  14. --- a/src/local.c
  15. +++ b/src/local.c
  16. @@ -205,6 +205,14 @@ create_and_bind(const char *addr, const char *port)
  17. }
  18. }
  19. + if (tcp_incoming_sndbuf > 0) {
  20. + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  21. + }
  22. +
  23. + if (tcp_incoming_rcvbuf > 0) {
  24. + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  25. + }
  26. +
  27. s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
  28. if (s == 0) {
  29. /* We managed to bind successfully! */
  30. @@ -1406,14 +1414,6 @@ accept_cb(EV_P_ ev_io *w, int revents)
  31. setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  32. #endif
  33. - if (tcp_incoming_sndbuf > 0) {
  34. - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  35. - }
  36. -
  37. - if (tcp_incoming_rcvbuf > 0) {
  38. - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  39. - }
  40. -
  41. server_t *server = new_server(serverfd);
  42. server->listener = listener;
  43. diff --git a/src/redir.c b/src/redir.c
  44. index d36fe3f..86b7238 100644
  45. --- a/src/redir.c
  46. +++ b/src/redir.c
  47. @@ -201,6 +201,14 @@ create_and_bind(const char *addr, const char *port)
  48. LOGI("tcp tproxy mode enabled");
  49. }
  50. + if (tcp_incoming_sndbuf > 0) {
  51. + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  52. + }
  53. +
  54. + if (tcp_incoming_rcvbuf > 0) {
  55. + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  56. + }
  57. +
  58. s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
  59. if (s == 0) {
  60. /* We managed to bind successfully! */
  61. @@ -759,14 +767,6 @@ accept_cb(EV_P_ ev_io *w, int revents)
  62. setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  63. #endif
  64. - if (tcp_incoming_sndbuf > 0) {
  65. - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  66. - }
  67. -
  68. - if (tcp_incoming_rcvbuf > 0) {
  69. - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  70. - }
  71. -
  72. int index = rand() % listener->remote_num;
  73. struct sockaddr *remote_addr = listener->remote_addr[index];
  74. diff --git a/src/server.c b/src/server.c
  75. index 73b6599..ef347a5 100644
  76. --- a/src/server.c
  77. +++ b/src/server.c
  78. @@ -620,6 +620,14 @@ create_and_bind(const char *host, const char *port, int mptcp)
  79. }
  80. }
  81. + if (tcp_incoming_sndbuf > 0) {
  82. + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  83. + }
  84. +
  85. + if (tcp_incoming_rcvbuf > 0) {
  86. + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  87. + }
  88. +
  89. // Enable out-of-tree mptcp
  90. if (mptcp == 1) {
  91. int i = 0;
  92. @@ -1769,14 +1777,6 @@ accept_cb(EV_P_ ev_io *w, int revents)
  93. setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  94. #endif
  95. - if (tcp_incoming_sndbuf > 0) {
  96. - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  97. - }
  98. -
  99. - if (tcp_incoming_rcvbuf > 0) {
  100. - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  101. - }
  102. -
  103. setnonblocking(serverfd);
  104. server_t *server = new_server(serverfd, listener);
  105. diff --git a/src/tunnel.c b/src/tunnel.c
  106. index 99ed412..9f0dd57 100644
  107. --- a/src/tunnel.c
  108. +++ b/src/tunnel.c
  109. @@ -166,6 +166,14 @@ create_and_bind(const char *addr, const char *port)
  110. }
  111. }
  112. + if (tcp_incoming_sndbuf > 0) {
  113. + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  114. + }
  115. +
  116. + if (tcp_incoming_rcvbuf > 0) {
  117. + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  118. + }
  119. +
  120. s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
  121. if (s == 0) {
  122. /* We managed to bind successfully! */
  123. @@ -725,14 +733,6 @@ accept_cb(EV_P_ ev_io *w, int revents)
  124. setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  125. #endif
  126. - if (tcp_incoming_sndbuf > 0) {
  127. - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  128. - }
  129. -
  130. - if (tcp_incoming_rcvbuf > 0) {
  131. - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  132. - }
  133. -
  134. int index = rand() % listener->remote_num;
  135. struct sockaddr *remote_addr = listener->remote_addr[index];
  136. --
  137. 2.39.5