Browse code

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

Gert Doering authored on 2014/03/30 21:09:36
Showing 2 changed files
... ...
@@ -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,