summaryrefslogtreecommitdiff
path: root/apps/s_socket.c
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2021-09-01 02:23:22 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2021-09-01 02:23:22 +0000
commitc1d1798abd60f12527b70443cb7d0b9cd78ef7b1 (patch)
tree1ac1ccb6b23135a8b57efdff5c4a84ad03202f7a /apps/s_socket.c
parent94fa08a4bcdfbb3434b025d67d014af3b18e5380 (diff)
Import OpenSSL 1.1.1lvendor/openssl/1.1.1l
Diffstat (limited to 'apps/s_socket.c')
-rw-r--r--apps/s_socket.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/apps/s_socket.c b/apps/s_socket.c
index 76f928900207..aee366d5f457 100644
--- a/apps/s_socket.c
+++ b/apps/s_socket.c
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -214,6 +214,8 @@ int do_server(int *accept_sock, const char *host, const char *port,
const BIO_ADDRINFO *next;
int sock_family, sock_type, sock_protocol, sock_port;
const BIO_ADDR *sock_address;
+ int sock_family_fallback = AF_UNSPEC;
+ const BIO_ADDR *sock_address_fallback = NULL;
int sock_options = BIO_SOCK_REUSEADDR;
int ret = 0;
@@ -244,6 +246,10 @@ int do_server(int *accept_sock, const char *host, const char *port,
&& BIO_ADDRINFO_protocol(next) == sock_protocol) {
if (sock_family == AF_INET
&& BIO_ADDRINFO_family(next) == AF_INET6) {
+ /* In case AF_INET6 is returned but not supported by the
+ * kernel, retry with the first detected address family */
+ sock_family_fallback = sock_family;
+ sock_address_fallback = sock_address;
sock_family = AF_INET6;
sock_address = BIO_ADDRINFO_address(next);
} else if (sock_family == AF_INET6
@@ -253,6 +259,10 @@ int do_server(int *accept_sock, const char *host, const char *port,
}
asock = BIO_socket(sock_family, sock_type, sock_protocol, 0);
+ if (asock == INVALID_SOCKET && sock_family_fallback != AF_UNSPEC) {
+ asock = BIO_socket(sock_family_fallback, sock_type, sock_protocol, 0);
+ sock_address = sock_address_fallback;
+ }
if (asock == INVALID_SOCKET
|| !BIO_listen(asock, sock_address, sock_options)) {
BIO_ADDRINFO_free(res);