Commit a6dab873 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

PR: 2005

Submitted by: steve@openssl.org

Some systems have broken IPv6 headers and/or implementations. If
OPENSSL_USE_IPV6 is set to 0 IPv6 is not used, if it is set to 1 it is used
and if undefined an attempt is made to detect at compile time by checking
if AF_INET6 is set and excluding known problem platforms.
parent 480b9e5d
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -88,11 +88,6 @@ NETDB_DEFINE_CONTEXT
static int wsa_init_done=0;
#endif

#if defined(OPENSSL_SYS_BEOS_BONE)		
/* BONE's IP6 support is incomplete */
#undef AF_INET6
#endif

#if 0
static unsigned long BIO_ghbn_hits=0L;
static unsigned long BIO_ghbn_miss=0L;
@@ -654,7 +649,7 @@ int BIO_get_accept_socket(char *host, int bind_mode)
		if (strchr(h,':'))
			{
			if (h[1]=='\0') h=NULL;
#ifdef AF_INET6
#if OPENSSL_USE_IPV6
			hint.ai_family = AF_INET6;
#else
			h=NULL;
@@ -720,7 +715,7 @@ again:
			client = server;
			if (h == NULL || strcmp(h,"*") == 0)
				{
#ifdef AF_INET6
#if OPENSSL_USE_IPV6
				if (client.sa_family == AF_INET6)
					{
					struct sockaddr_in6 *sin6 =
+4 −0
Original line number Diff line number Diff line
@@ -429,12 +429,14 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
				&sockopt_val, sizeof(sockopt_val))) < 0)
				perror("setsockopt");
			break;
#if OPENSSL_USE_IPV6
		case AF_INET6:
			sockopt_val = IPV6_PMTUDISC_DO;
			if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
				&sockopt_val, sizeof(sockopt_val))) < 0)
				perror("setsockopt");
			break;
#endif
		default:
			ret = -1;
			break;
@@ -470,6 +472,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
				ret = data->mtu;
				}
			break;
#if OPENSSL_USE_IPV6
		case AF_INET6:
			if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU, (void *)&sockopt_val,
				&sockopt_len)) < 0 || sockopt_val < 0)
@@ -485,6 +488,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
				ret = data->mtu;
				}
			break;
#endif
		default:
			ret = 0;
			break;
+12 −0
Original line number Diff line number Diff line
@@ -624,6 +624,18 @@ static unsigned int _strlen31(const char *str)
#    define INVALID_SOCKET	(-1)
#    endif /* INVALID_SOCKET */
#  endif

/* Some IPv6 implementations are broken, disable them in known bad
 * versions.
 */
#  if !defined(OPENSSL_USE_IPV6)
#    if defined(AF_INET6) && !defined(OPENSSL_SYS_BEOS_BONE) && !defined(NETWARE_CLIB)
#      define OPENSSL_USE_IPV6 1
#    else
#      define OPENSSL_USE_IPV6 0
#    endif
#  endif

#endif

#if defined(__ultrix)