Implement server_poll_timeout for socks

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)
This commit is contained in:
5andr0 2024-03-15 17:20:11 +01:00 committed by Gert Doering
parent d5c4c643f3
commit 94bfb71236
3 changed files with 18 additions and 11 deletions

View File

@ -2078,6 +2078,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)
@ -2107,6 +2108,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)

View File

@ -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;
@ -129,7 +130,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);
@ -185,11 +186,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)] */
@ -216,7 +217,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);
@ -283,7 +284,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;
}
@ -301,13 +302,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)
{
@ -326,7 +327,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);
@ -451,12 +452,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;
}
@ -494,7 +496,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;
}
@ -512,9 +514,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;
}
@ -535,7 +538,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;
}

View File

@ -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,