Hi, On Sun, Apr 06, 2014 at 10:53:11AM +0200, Gert Doering wrote: > A slightly simpler version of this could go to the beginning of > create_socket() (--> no ai_next chain walking needed, etc.).
Arne suggested an even more simple version of this - which is convincing, because it takes away lines of code, instead of adding more :-) Patch attached. (Tested, works!) gert -- USENET is *not* the non-clickable part of WWW! //www.muc.de/~gert/ Gert Doering - Munich, Germany g...@greenie.muc.de fax: +49-89-35655025 g...@net.informatik.tu-muenchen.de
From a9b7c4e0fcdf89efb71a910c2295c6158113a732 Mon Sep 17 00:00:00 2001 From: Gert Doering <g...@greenie.muc.de> List-Post: openvpn-devel@lists.sourceforge.net Date: Mon, 7 Apr 2014 22:12:05 +0200 Subject: [PATCH] Work around Solaris getaddrinfo() returing ai_protocol=0 Create_socket() and sub-functions assume that the ai_protocol value returned by getaddrinfo() is IPPROTO_UDP or IPPROTO_TCP. On Solaris, it is "0", because Solaris's socket() call will then "select the right protocol" - but it breaks our code. So remove ASSERT()s on ai_protocol, and also accept properly set ai_socktype (SOCK_DGRAM/SOCK_STREAM) values if ai_protocol is not set. Signed-off-by: Gert Doering <g...@greenie.muc.de> --- src/openvpn/socket.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index 7deef0a..ed4bc6f 100644 --- a/src/openvpn/socket.c +++ b/src/openvpn/socket.c @@ -775,7 +775,6 @@ create_socket_tcp (struct addrinfo* addrinfo) ASSERT (addrinfo); ASSERT (addrinfo->ai_socktype == SOCK_STREAM); - ASSERT (addrinfo->ai_protocol == IPPROTO_TCP); if ((sd = socket (addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol)) < 0) msg (M_ERR, "Cannot create TCP socket"); @@ -800,7 +799,6 @@ create_socket_udp (struct addrinfo* addrinfo, const unsigned int flags) ASSERT (addrinfo); ASSERT (addrinfo->ai_socktype == SOCK_DGRAM); - ASSERT (addrinfo->ai_protocol == IPPROTO_UDP); if ((sd = socket (addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol)) < 0) msg (M_ERR, "UDP: Cannot create UDP/UDP6 socket"); @@ -858,7 +856,7 @@ static void bind_local (struct link_socket *sock, const sa_family_t ai_family) static void create_socket (struct link_socket* sock, struct addrinfo* addr) { - if (addr->ai_protocol == IPPROTO_UDP) + if (addr->ai_protocol == IPPROTO_UDP || addr->ai_socktype == SOCK_DGRAM) { sock->sd = create_socket_udp (addr, sock->sockflags); sock->sockflags |= SF_GETADDRINFO_DGRAM; @@ -878,7 +876,7 @@ create_socket (struct link_socket* sock, struct addrinfo* addr) } #endif } - else if (addr->ai_protocol == IPPROTO_TCP) + else if (addr->ai_protocol == IPPROTO_TCP || addr->ai_socktype == SOCK_STREAM) { sock->sd = create_socket_tcp (addr); } @@ -1806,7 +1804,6 @@ phase2_tcp_client (struct link_socket *sock, struct signal_info *sig_info) const bool proxy_retry = false; #endif do { - ASSERT (sock->info.lsa->current_remote->ai_protocol == IPPROTO_TCP); socket_connect (&sock->sd, sock->info.lsa->current_remote->ai_addr, sock->connect_timeout, -- 1.5.6.5
pgpNKsmbidni2.pgp
Description: PGP signature