Fix crash when using --inetd.
PATCH 1/1 Fix crash when using --inetd.
Change "local" argument to socket_do_listen() to avoid calling "local->ai_addr" in the caller for the "do_listen == FALSE" case, in which case it could be NULL.
Also, ensure "ai" is always initialized in socket_listen_accept() for the "!remote_dynamic" case - otherwise it will sometimes(!) crash in addrlist_match() later on.
Get rid of spurious operator precedence warning concerning GETADDR_CACHE_MASK.
--- src/openvpn/socket.c | 11 ++++++----- src/openvpn/socket.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-)
src/openvpn/socket.c +6 -5
@@ -917,15 +917,16 @@ static void protect_fd_nonlocal (int fd, const struct sockaddr* addr)*/ static void socket_do_listen (socket_descriptor_t sd, -const struct sockaddr *local, +const struct addrinfo *local,bool do_listen,bool do_set_nonblock) {struct gc_arena gc =gc_new ();if (do_listen) { +ASSERT (local);msg (M_INFO ,"Listening for incoming TCP connection on %s" , -print_sockaddr (local, &gc)); +print_sockaddr (local->ai_addr, &gc));if (listen (sd,1 ))msg (M_ERR ,"TCP: listen() failed" ); }
@@ -1018,7 +1019,7 @@ socket_listen_accept (socket_descriptor_t sd,int new_sd =SOCKET_UNDEFINED ;CLEAR (*act); -socket_do_listen (sd, local->ai_addr, do_listen, true); +socket_do_listen (sd, local, do_listen, true);while (true) {
@@ -1053,7 +1054,7 @@ socket_listen_accept (socket_descriptor_t sd,if (socket_defined (new_sd)) { -struct addrinfo * ai; +struct addrinfo * ai =NULL ;if (remote_dynamic)openvpn_getaddrinfo (0 , remote_dynamic,NULL ,1 ,NULL , remote_verify.addr.sa.sa_family, &ai);
@@ -1775,7 +1776,7 @@ phase2_tcp_server (struct link_socket *sock, const char *remote_dynamic,break ;case LS_MODE_TCP_LISTEN :socket_do_listen (sock->sd, - sock->info.lsa->bind_local->ai_addr, + sock->info.lsa->bind_local, true, false);break ;
src/openvpn/socket.h +1 -1
@@ -524,7 +524,7 @@ bool unix_socket_get_peer_uid_gid (const socket_descriptor_t sd, int *uid, int *#define GETADDR_PASSIVE (1<<10)#define GETADDR_DATAGRAM (1<<11) -#define GETADDR_CACHE_MASK GETADDR_DATAGRAM|GETADDR_PASSIVE +#define GETADDR_CACHE_MASK (GETADDR_DATAGRAM|GETADDR_PASSIVE) in_addr_t getaddr (unsigned int flags, const char *hostname,
Signature · 1 line
1.8.3.2
Am 30.03.14 14:09, schrieb Gert Doering:
Quoted 11 lines
Change "local" argument to
socket_do_listen()to avoid calling "local->ai_addr" in the caller for the "do_listen== FALSE" case, in which case it could be NULL.Also, ensure "ai" is always initialized in
socket_listen_accept()for the "!remote_dynamic" case - otherwise it will sometimes(!) crash inaddrlist_match()later on.Get rid of spurious operator precedence warning concerning
GETADDR_CACHE_MASK.
ACK.
Arne
Patch has been applied to the master branch.
commit 1ba6f427d3ea361b9859cff9cbf4d1887240ed6f (master)
Author: Gert Doering Date: Sun Mar 30 14:09:36 2014 +0200
Fix crash when using --inetd.
Signed-off-by: Gert Doering <[email protected]...>
Acked-by: Arne Schwabe <[email protected]...>
Message-Id: <[email protected]...>
URL: http://article.gmane.org/gmane.network.openvpn.devel/8412--
kind regards,
Gert Doering