diff options
author | Gert Doering <gert@greenie.muc.de> | 2014-03-30 14:09:36 +0200 |
---|---|---|
committer | Gert Doering <gert@greenie.muc.de> | 2014-03-30 15:35:29 +0200 |
commit | 1ba6f427d3ea361b9859cff9cbf4d1887240ed6f (patch) | |
tree | 8c3fceb3c78c58da959bcae8df1d39e23d13d8b3 /src/openvpn/socket.c | |
parent | f1da227574c6b2e3a75a38ac6f9a196be0ad3071 (diff) | |
download | openvpn-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
Diffstat (limited to 'src/openvpn/socket.c')
-rw-r--r-- | src/openvpn/socket.c | 11 |
1 files changed, 6 insertions, 5 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; |