summaryrefslogtreecommitdiffstats
path: root/src/openvpn/socket.c
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 /src/openvpn/socket.c
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
Diffstat (limited to 'src/openvpn/socket.c')
-rw-r--r--src/openvpn/socket.c11
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;