mirror of
https://github.com/OpenVPN/openvpn.git
synced 2025-05-08 21:25:53 +08:00
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>
This commit is contained in:
parent
06c7ce5d1f
commit
b3a68b85a7
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user