So far --server-poll-timeout was only applied
for HTTP proxies, apply it also to SOCKS proxies.
This removes the default 5 second socks connect timeout
which can be too small depending on network setup and
replaces it with the configurable overall connect timeout
(default 120 seconds).
Trac: #328
Github: fixes OpenVPN/openvpn#267
Change-Id: I2b109f8c551c23045a1be355778b08f0fd4d309f
Signed-off-by: 5andr0 <sandro.trianni@gmail.com>
Tested-By: ValdikSS <valdikss@gmail.com>
Acked-by: Frank Lichtenheld <frank@lichtenheld.com>
Message-Id: <20240315162011.1661139-1-frank@lichtenheld.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg28408.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
(cherry picked from commit b3a68b85a729628ca8b97f9f0c2813f795289cfc)
| ... | ... |
@@ -2078,6 +2078,7 @@ phase2_tcp_client(struct link_socket *sock, struct signal_info *sig_info) |
| 2078 | 2078 |
sock->sd, |
| 2079 | 2079 |
sock->proxy_dest_host, |
| 2080 | 2080 |
sock->proxy_dest_port, |
| 2081 |
+ sock->server_poll_timeout, |
|
| 2081 | 2082 |
sig_info); |
| 2082 | 2083 |
} |
| 2083 | 2084 |
if (proxy_retry) |
| ... | ... |
@@ -2107,6 +2108,7 @@ phase2_socks_client(struct link_socket *sock, struct signal_info *sig_info) |
| 2107 | 2107 |
sock->ctrl_sd, |
| 2108 | 2108 |
sock->sd, |
| 2109 | 2109 |
&sock->socks_relay.dest, |
| 2110 |
+ sock->server_poll_timeout, |
|
| 2110 | 2111 |
sig_info); |
| 2111 | 2112 |
|
| 2112 | 2113 |
if (sig_info->signal_received) |
| ... | ... |
@@ -42,6 +42,7 @@ |
| 42 | 42 |
#include "fdmisc.h" |
| 43 | 43 |
#include "misc.h" |
| 44 | 44 |
#include "proxy.h" |
| 45 |
+#include "forward.h" |
|
| 45 | 46 |
|
| 46 | 47 |
#include "memdbg.h" |
| 47 | 48 |
|
| ... | ... |
@@ -85,12 +86,12 @@ socks_proxy_close(struct socks_proxy_info *sp) |
| 85 | 85 |
static bool |
| 86 | 86 |
socks_username_password_auth(struct socks_proxy_info *p, |
| 87 | 87 |
socket_descriptor_t sd, |
| 88 |
+ struct event_timeout *server_poll_timeout, |
|
| 88 | 89 |
volatile int *signal_received) |
| 89 | 90 |
{
|
| 90 | 91 |
char to_send[516]; |
| 91 | 92 |
char buf[2]; |
| 92 | 93 |
int len = 0; |
| 93 |
- const int timeout_sec = 5; |
|
| 94 | 94 |
struct user_pass creds; |
| 95 | 95 |
ssize_t size; |
| 96 | 96 |
bool ret = false; |
| ... | ... |
@@ -129,7 +130,7 @@ socks_username_password_auth(struct socks_proxy_info *p, |
| 129 | 129 |
|
| 130 | 130 |
FD_ZERO(&reads); |
| 131 | 131 |
openvpn_fd_set(sd, &reads); |
| 132 |
- tv.tv_sec = timeout_sec; |
|
| 132 |
+ tv.tv_sec = get_server_poll_remaining_time(server_poll_timeout); |
|
| 133 | 133 |
tv.tv_usec = 0; |
| 134 | 134 |
|
| 135 | 135 |
status = select(sd + 1, &reads, NULL, NULL, &tv); |
| ... | ... |
@@ -185,11 +186,11 @@ cleanup: |
| 185 | 185 |
static bool |
| 186 | 186 |
socks_handshake(struct socks_proxy_info *p, |
| 187 | 187 |
socket_descriptor_t sd, |
| 188 |
+ struct event_timeout *server_poll_timeout, |
|
| 188 | 189 |
volatile int *signal_received) |
| 189 | 190 |
{
|
| 190 | 191 |
char buf[2]; |
| 191 | 192 |
int len = 0; |
| 192 |
- const int timeout_sec = 5; |
|
| 193 | 193 |
ssize_t size; |
| 194 | 194 |
|
| 195 | 195 |
/* VER = 5, NMETHODS = 1, METHODS = [0 (no auth)] */ |
| ... | ... |
@@ -216,7 +217,7 @@ socks_handshake(struct socks_proxy_info *p, |
| 216 | 216 |
|
| 217 | 217 |
FD_ZERO(&reads); |
| 218 | 218 |
openvpn_fd_set(sd, &reads); |
| 219 |
- tv.tv_sec = timeout_sec; |
|
| 219 |
+ tv.tv_sec = get_server_poll_remaining_time(server_poll_timeout); |
|
| 220 | 220 |
tv.tv_usec = 0; |
| 221 | 221 |
|
| 222 | 222 |
status = select(sd + 1, &reads, NULL, NULL, &tv); |
| ... | ... |
@@ -283,7 +284,7 @@ socks_handshake(struct socks_proxy_info *p, |
| 283 | 283 |
return false; |
| 284 | 284 |
} |
| 285 | 285 |
|
| 286 |
- if (!socks_username_password_auth(p, sd, signal_received)) |
|
| 286 |
+ if (!socks_username_password_auth(p, sd, server_poll_timeout, signal_received)) |
|
| 287 | 287 |
{
|
| 288 | 288 |
return false; |
| 289 | 289 |
} |
| ... | ... |
@@ -301,13 +302,13 @@ socks_handshake(struct socks_proxy_info *p, |
| 301 | 301 |
static bool |
| 302 | 302 |
recv_socks_reply(socket_descriptor_t sd, |
| 303 | 303 |
struct openvpn_sockaddr *addr, |
| 304 |
+ struct event_timeout *server_poll_timeout, |
|
| 304 | 305 |
volatile int *signal_received) |
| 305 | 306 |
{
|
| 306 | 307 |
char atyp = '\0'; |
| 307 | 308 |
int alen = 0; |
| 308 | 309 |
int len = 0; |
| 309 | 310 |
char buf[270]; /* 4 + alen(max 256) + 2 */ |
| 310 |
- const int timeout_sec = 5; |
|
| 311 | 311 |
|
| 312 | 312 |
if (addr != NULL) |
| 313 | 313 |
{
|
| ... | ... |
@@ -326,7 +327,7 @@ recv_socks_reply(socket_descriptor_t sd, |
| 326 | 326 |
|
| 327 | 327 |
FD_ZERO(&reads); |
| 328 | 328 |
openvpn_fd_set(sd, &reads); |
| 329 |
- tv.tv_sec = timeout_sec; |
|
| 329 |
+ tv.tv_sec = get_server_poll_remaining_time(server_poll_timeout); |
|
| 330 | 330 |
tv.tv_usec = 0; |
| 331 | 331 |
|
| 332 | 332 |
status = select(sd + 1, &reads, NULL, NULL, &tv); |
| ... | ... |
@@ -451,12 +452,13 @@ establish_socks_proxy_passthru(struct socks_proxy_info *p, |
| 451 | 451 |
socket_descriptor_t sd, /* already open to proxy */ |
| 452 | 452 |
const char *host, /* openvpn server remote */ |
| 453 | 453 |
const char *servname, /* openvpn server port */ |
| 454 |
+ struct event_timeout *server_poll_timeout, |
|
| 454 | 455 |
struct signal_info *sig_info) |
| 455 | 456 |
{
|
| 456 | 457 |
char buf[270]; |
| 457 | 458 |
size_t len; |
| 458 | 459 |
|
| 459 |
- if (!socks_handshake(p, sd, &sig_info->signal_received)) |
|
| 460 |
+ if (!socks_handshake(p, sd, server_poll_timeout, &sig_info->signal_received)) |
|
| 460 | 461 |
{
|
| 461 | 462 |
goto error; |
| 462 | 463 |
} |
| ... | ... |
@@ -494,7 +496,7 @@ establish_socks_proxy_passthru(struct socks_proxy_info *p, |
| 494 | 494 |
|
| 495 | 495 |
|
| 496 | 496 |
/* receive reply from Socks proxy and discard */ |
| 497 |
- if (!recv_socks_reply(sd, NULL, &sig_info->signal_received)) |
|
| 497 |
+ if (!recv_socks_reply(sd, NULL, server_poll_timeout, &sig_info->signal_received)) |
|
| 498 | 498 |
{
|
| 499 | 499 |
goto error; |
| 500 | 500 |
} |
| ... | ... |
@@ -512,9 +514,10 @@ establish_socks_proxy_udpassoc(struct socks_proxy_info *p, |
| 512 | 512 |
socket_descriptor_t ctrl_sd, /* already open to proxy */ |
| 513 | 513 |
socket_descriptor_t udp_sd, |
| 514 | 514 |
struct openvpn_sockaddr *relay_addr, |
| 515 |
+ struct event_timeout *server_poll_timeout, |
|
| 515 | 516 |
struct signal_info *sig_info) |
| 516 | 517 |
{
|
| 517 |
- if (!socks_handshake(p, ctrl_sd, &sig_info->signal_received)) |
|
| 518 |
+ if (!socks_handshake(p, ctrl_sd, server_poll_timeout, &sig_info->signal_received)) |
|
| 518 | 519 |
{
|
| 519 | 520 |
goto error; |
| 520 | 521 |
} |
| ... | ... |
@@ -535,7 +538,7 @@ establish_socks_proxy_udpassoc(struct socks_proxy_info *p, |
| 535 | 535 |
|
| 536 | 536 |
/* receive reply from Socks proxy */ |
| 537 | 537 |
CLEAR(*relay_addr); |
| 538 |
- if (!recv_socks_reply(ctrl_sd, relay_addr, &sig_info->signal_received)) |
|
| 538 |
+ if (!recv_socks_reply(ctrl_sd, relay_addr, server_poll_timeout, &sig_info->signal_received)) |
|
| 539 | 539 |
{
|
| 540 | 540 |
goto error; |
| 541 | 541 |
} |
| ... | ... |
@@ -52,12 +52,14 @@ void establish_socks_proxy_passthru(struct socks_proxy_info *p, |
| 52 | 52 |
socket_descriptor_t sd, /* already open to proxy */ |
| 53 | 53 |
const char *host, /* openvpn server remote */ |
| 54 | 54 |
const char *servname, /* openvpn server port */ |
| 55 |
+ struct event_timeout *server_poll_timeout, |
|
| 55 | 56 |
struct signal_info *sig_info); |
| 56 | 57 |
|
| 57 | 58 |
void establish_socks_proxy_udpassoc(struct socks_proxy_info *p, |
| 58 | 59 |
socket_descriptor_t ctrl_sd, /* already open to proxy */ |
| 59 | 60 |
socket_descriptor_t udp_sd, |
| 60 | 61 |
struct openvpn_sockaddr *relay_addr, |
| 62 |
+ struct event_timeout *server_poll_timeout, |
|
| 61 | 63 |
struct signal_info *sig_info); |
| 62 | 64 |
|
| 63 | 65 |
void socks_process_incoming_udp(struct buffer *buf, |