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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. --- a/src/local.c
  13. +++ b/src/local.c
  14. @@ -205,6 +205,14 @@ create_and_bind(const char *addr, const
  15. }
  16. }
  17. + if (tcp_incoming_sndbuf > 0) {
  18. + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  19. + }
  20. +
  21. + if (tcp_incoming_rcvbuf > 0) {
  22. + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  23. + }
  24. +
  25. s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
  26. if (s == 0) {
  27. /* We managed to bind successfully! */
  28. @@ -1406,14 +1414,6 @@ accept_cb(EV_P_ ev_io *w, int revents)
  29. setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  30. #endif
  31. - if (tcp_incoming_sndbuf > 0) {
  32. - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  33. - }
  34. -
  35. - if (tcp_incoming_rcvbuf > 0) {
  36. - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  37. - }
  38. -
  39. server_t *server = new_server(serverfd);
  40. server->listener = listener;
  41. --- a/src/redir.c
  42. +++ b/src/redir.c
  43. @@ -201,6 +201,14 @@ create_and_bind(const char *addr, const
  44. LOGI("tcp tproxy mode enabled");
  45. }
  46. + if (tcp_incoming_sndbuf > 0) {
  47. + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  48. + }
  49. +
  50. + if (tcp_incoming_rcvbuf > 0) {
  51. + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  52. + }
  53. +
  54. s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
  55. if (s == 0) {
  56. /* We managed to bind successfully! */
  57. @@ -759,14 +767,6 @@ accept_cb(EV_P_ ev_io *w, int revents)
  58. setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  59. #endif
  60. - if (tcp_incoming_sndbuf > 0) {
  61. - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  62. - }
  63. -
  64. - if (tcp_incoming_rcvbuf > 0) {
  65. - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  66. - }
  67. -
  68. int index = rand() % listener->remote_num;
  69. struct sockaddr *remote_addr = listener->remote_addr[index];
  70. --- a/src/server.c
  71. +++ b/src/server.c
  72. @@ -620,6 +620,14 @@ create_and_bind(const char *host, const
  73. }
  74. }
  75. + if (tcp_incoming_sndbuf > 0) {
  76. + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  77. + }
  78. +
  79. + if (tcp_incoming_rcvbuf > 0) {
  80. + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  81. + }
  82. +
  83. // Enable out-of-tree mptcp
  84. if (mptcp == 1) {
  85. int i = 0;
  86. @@ -1769,14 +1777,6 @@ accept_cb(EV_P_ ev_io *w, int revents)
  87. setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  88. #endif
  89. - if (tcp_incoming_sndbuf > 0) {
  90. - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  91. - }
  92. -
  93. - if (tcp_incoming_rcvbuf > 0) {
  94. - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  95. - }
  96. -
  97. setnonblocking(serverfd);
  98. server_t *server = new_server(serverfd, listener);
  99. --- a/src/tunnel.c
  100. +++ b/src/tunnel.c
  101. @@ -166,6 +166,14 @@ create_and_bind(const char *addr, const
  102. }
  103. }
  104. + if (tcp_incoming_sndbuf > 0) {
  105. + setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  106. + }
  107. +
  108. + if (tcp_incoming_rcvbuf > 0) {
  109. + setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  110. + }
  111. +
  112. s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
  113. if (s == 0) {
  114. /* We managed to bind successfully! */
  115. @@ -725,14 +733,6 @@ accept_cb(EV_P_ ev_io *w, int revents)
  116. setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  117. #endif
  118. - if (tcp_incoming_sndbuf > 0) {
  119. - setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));
  120. - }
  121. -
  122. - if (tcp_incoming_rcvbuf > 0) {
  123. - setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));
  124. - }
  125. -
  126. int index = rand() % listener->remote_num;
  127. struct sockaddr *remote_addr = listener->remote_addr[index];