summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGert Doering <gert@greenie.muc.de>2014-03-30 14:09:36 +0200
committerGert Doering <gert@greenie.muc.de>2014-03-30 15:35:29 +0200
commit1ba6f427d3ea361b9859cff9cbf4d1887240ed6f (patch)
tree8c3fceb3c78c58da959bcae8df1d39e23d13d8b3
parentf1da227574c6b2e3a75a38ac6f9a196be0ad3071 (diff)
downloadopenvpn-1ba6f427d3ea361b9859cff9cbf4d1887240ed6f.tar.gz
openvpn-1ba6f427d3ea361b9859cff9cbf4d1887240ed6f.tar.xz
openvpn-1ba6f427d3ea361b9859cff9cbf4d1887240ed6f.zip
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. Signed-off-by: Gert Doering <gert@greenie.muc.de> Acked-by: Arne Schwabe <arne@rfc2549.org> Message-Id: <1396181376-32022-1-git-send-email-gert@greenie.muc.de> URL: http://article.gmane.org/gmane.network.openvpn.devel/8412
-rw-r--r--src/openvpn/socket.c11
-rw-r--r--src/openvpn/socket.h2
2 files changed, 7 insertions, 6 deletions
diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c
index b769171..7deef0a 100644
--- a/src/openvpn/socket.c
+++ b/src/openvpn/socket.c
@@ -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;
diff --git a/src/openvpn/socket.h b/src/openvpn/socket.h
index f27e9a9..bffa039 100644
--- a/src/openvpn/socket.h
+++ b/src/openvpn/socket.h
@@ -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,