diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index 24d12768..17c5e769 100644 --- a/src/openvpn/socket.c +++ b/src/openvpn/socket.c @@ -2076,6 +2076,7 @@ phase2_tcp_client(struct link_socket *sock, struct signal_info *sig_info) sock->sd, sock->proxy_dest_host, sock->proxy_dest_port, + sock->server_poll_timeout, sig_info); } if (proxy_retry) @@ -2105,6 +2106,7 @@ phase2_socks_client(struct link_socket *sock, struct signal_info *sig_info) sock->ctrl_sd, sock->sd, &sock->socks_relay.dest, + sock->server_poll_timeout, sig_info); if (sig_info->signal_received) diff --git a/src/openvpn/socks.c b/src/openvpn/socks.c index 8b8c01a9..d95f3013 100644 --- a/src/openvpn/socks.c +++ b/src/openvpn/socks.c @@ -42,6 +42,7 @@ #include "fdmisc.h" #include "misc.h" #include "proxy.h" +#include "forward.h" #include "memdbg.h" @@ -85,12 +86,12 @@ socks_proxy_close(struct socks_proxy_info *sp) static bool socks_username_password_auth(struct socks_proxy_info *p, socket_descriptor_t sd, + struct event_timeout *server_poll_timeout, volatile int *signal_received) { char to_send[516]; char buf[2]; int len = 0; - const int timeout_sec = 5; struct user_pass creds; ssize_t size; bool ret = false; @@ -133,7 +134,7 @@ socks_username_password_auth(struct socks_proxy_info *p, FD_ZERO(&reads); openvpn_fd_set(sd, &reads); - tv.tv_sec = timeout_sec; + tv.tv_sec = get_server_poll_remaining_time(server_poll_timeout); tv.tv_usec = 0; status = select(sd + 1, &reads, NULL, NULL, &tv); @@ -189,11 +190,11 @@ cleanup: static bool socks_handshake(struct socks_proxy_info *p, socket_descriptor_t sd, + struct event_timeout *server_poll_timeout, volatile int *signal_received) { char buf[2]; int len = 0; - const int timeout_sec = 5; ssize_t size; /* VER = 5, NMETHODS = 1, METHODS = [0 (no auth)] */ @@ -220,7 +221,7 @@ socks_handshake(struct socks_proxy_info *p, FD_ZERO(&reads); openvpn_fd_set(sd, &reads); - tv.tv_sec = timeout_sec; + tv.tv_sec = get_server_poll_remaining_time(server_poll_timeout); tv.tv_usec = 0; status = select(sd + 1, &reads, NULL, NULL, &tv); @@ -287,7 +288,7 @@ socks_handshake(struct socks_proxy_info *p, return false; } - if (!socks_username_password_auth(p, sd, signal_received)) + if (!socks_username_password_auth(p, sd, server_poll_timeout, signal_received)) { return false; } @@ -305,13 +306,13 @@ socks_handshake(struct socks_proxy_info *p, static bool recv_socks_reply(socket_descriptor_t sd, struct openvpn_sockaddr *addr, + struct event_timeout *server_poll_timeout, volatile int *signal_received) { char atyp = '\0'; int alen = 0; int len = 0; char buf[270]; /* 4 + alen(max 256) + 2 */ - const int timeout_sec = 5; if (addr != NULL) { @@ -330,7 +331,7 @@ recv_socks_reply(socket_descriptor_t sd, FD_ZERO(&reads); openvpn_fd_set(sd, &reads); - tv.tv_sec = timeout_sec; + tv.tv_sec = get_server_poll_remaining_time(server_poll_timeout); tv.tv_usec = 0; status = select(sd + 1, &reads, NULL, NULL, &tv); @@ -455,12 +456,13 @@ establish_socks_proxy_passthru(struct socks_proxy_info *p, socket_descriptor_t sd, /* already open to proxy */ const char *host, /* openvpn server remote */ const char *servname, /* openvpn server port */ + struct event_timeout *server_poll_timeout, struct signal_info *sig_info) { char buf[270]; size_t len; - if (!socks_handshake(p, sd, &sig_info->signal_received)) + if (!socks_handshake(p, sd, server_poll_timeout, &sig_info->signal_received)) { goto error; } @@ -498,7 +500,7 @@ establish_socks_proxy_passthru(struct socks_proxy_info *p, /* receive reply from Socks proxy and discard */ - if (!recv_socks_reply(sd, NULL, &sig_info->signal_received)) + if (!recv_socks_reply(sd, NULL, server_poll_timeout, &sig_info->signal_received)) { goto error; } @@ -516,9 +518,10 @@ establish_socks_proxy_udpassoc(struct socks_proxy_info *p, socket_descriptor_t ctrl_sd, /* already open to proxy */ socket_descriptor_t udp_sd, struct openvpn_sockaddr *relay_addr, + struct event_timeout *server_poll_timeout, struct signal_info *sig_info) { - if (!socks_handshake(p, ctrl_sd, &sig_info->signal_received)) + if (!socks_handshake(p, ctrl_sd, server_poll_timeout, &sig_info->signal_received)) { goto error; } @@ -539,7 +542,7 @@ establish_socks_proxy_udpassoc(struct socks_proxy_info *p, /* receive reply from Socks proxy */ CLEAR(*relay_addr); - if (!recv_socks_reply(ctrl_sd, relay_addr, &sig_info->signal_received)) + if (!recv_socks_reply(ctrl_sd, relay_addr, server_poll_timeout, &sig_info->signal_received)) { goto error; } diff --git a/src/openvpn/socks.h b/src/openvpn/socks.h index 9a8da063..5c4b4a1b 100644 --- a/src/openvpn/socks.h +++ b/src/openvpn/socks.h @@ -52,12 +52,14 @@ void establish_socks_proxy_passthru(struct socks_proxy_info *p, socket_descriptor_t sd, /* already open to proxy */ const char *host, /* openvpn server remote */ const char *servname, /* openvpn server port */ + struct event_timeout *server_poll_timeout, struct signal_info *sig_info); void establish_socks_proxy_udpassoc(struct socks_proxy_info *p, socket_descriptor_t ctrl_sd, /* already open to proxy */ socket_descriptor_t udp_sd, struct openvpn_sockaddr *relay_addr, + struct event_timeout *server_poll_timeout, struct signal_info *sig_info); void socks_process_incoming_udp(struct buffer *buf,