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
... | ... |
@@ -917,15 +917,16 @@ static void protect_fd_nonlocal (int fd, const struct sockaddr* addr) |
917 | 917 |
*/ |
918 | 918 |
static void |
919 | 919 |
socket_do_listen (socket_descriptor_t sd, |
920 |
- const struct sockaddr *local, |
|
920 |
+ const struct addrinfo *local, |
|
921 | 921 |
bool do_listen, |
922 | 922 |
bool do_set_nonblock) |
923 | 923 |
{ |
924 | 924 |
struct gc_arena gc = gc_new (); |
925 | 925 |
if (do_listen) |
926 | 926 |
{ |
927 |
+ ASSERT(local); |
|
927 | 928 |
msg (M_INFO, "Listening for incoming TCP connection on %s", |
928 |
- print_sockaddr (local, &gc)); |
|
929 |
+ print_sockaddr (local->ai_addr, &gc)); |
|
929 | 930 |
if (listen (sd, 1)) |
930 | 931 |
msg (M_ERR, "TCP: listen() failed"); |
931 | 932 |
} |
... | ... |
@@ -1018,7 +1019,7 @@ socket_listen_accept (socket_descriptor_t sd, |
1018 | 1018 |
int new_sd = SOCKET_UNDEFINED; |
1019 | 1019 |
|
1020 | 1020 |
CLEAR (*act); |
1021 |
- socket_do_listen (sd, local->ai_addr, do_listen, true); |
|
1021 |
+ socket_do_listen (sd, local, do_listen, true); |
|
1022 | 1022 |
|
1023 | 1023 |
while (true) |
1024 | 1024 |
{ |
... | ... |
@@ -1053,7 +1054,7 @@ socket_listen_accept (socket_descriptor_t sd, |
1053 | 1053 |
|
1054 | 1054 |
if (socket_defined (new_sd)) |
1055 | 1055 |
{ |
1056 |
- struct addrinfo* ai; |
|
1056 |
+ struct addrinfo* ai = NULL; |
|
1057 | 1057 |
if(remote_dynamic) |
1058 | 1058 |
openvpn_getaddrinfo(0, remote_dynamic, NULL, 1, NULL, |
1059 | 1059 |
remote_verify.addr.sa.sa_family, &ai); |
... | ... |
@@ -1775,7 +1776,7 @@ phase2_tcp_server (struct link_socket *sock, const char *remote_dynamic, |
1775 | 1775 |
break; |
1776 | 1776 |
case LS_MODE_TCP_LISTEN: |
1777 | 1777 |
socket_do_listen (sock->sd, |
1778 |
- sock->info.lsa->bind_local->ai_addr, |
|
1778 |
+ sock->info.lsa->bind_local, |
|
1779 | 1779 |
true, |
1780 | 1780 |
false); |
1781 | 1781 |
break; |
... | ... |
@@ -524,7 +524,7 @@ bool unix_socket_get_peer_uid_gid (const socket_descriptor_t sd, int *uid, int * |
524 | 524 |
#define GETADDR_PASSIVE (1<<10) |
525 | 525 |
#define GETADDR_DATAGRAM (1<<11) |
526 | 526 |
|
527 |
-#define GETADDR_CACHE_MASK GETADDR_DATAGRAM|GETADDR_PASSIVE |
|
527 |
+#define GETADDR_CACHE_MASK (GETADDR_DATAGRAM|GETADDR_PASSIVE) |
|
528 | 528 |
|
529 | 529 |
in_addr_t getaddr (unsigned int flags, |
530 | 530 |
const char *hostname, |