|
|
0c50f5 |
diff -up openssl-1.1.1k/apps/s_socket.c.addr-ipv6 openssl-1.1.1k/apps/s_socket.c
|
|
|
0c50f5 |
--- openssl-1.1.1k/apps/s_socket.c.addr-ipv6 2021-07-16 15:14:08.491986682 +0200
|
|
|
0c50f5 |
+++ openssl-1.1.1k/apps/s_socket.c 2021-07-16 15:23:21.271329197 +0200
|
|
|
0c50f5 |
@@ -214,6 +214,8 @@ int do_server(int *accept_sock, const ch
|
|
|
0c50f5 |
const BIO_ADDRINFO *next;
|
|
|
0c50f5 |
int sock_family, sock_type, sock_protocol, sock_port;
|
|
|
0c50f5 |
const BIO_ADDR *sock_address;
|
|
|
0c50f5 |
+ int sock_family_fallback = AF_UNSPEC;
|
|
|
0c50f5 |
+ const BIO_ADDR *sock_address_fallback = NULL;
|
|
|
0c50f5 |
int sock_options = BIO_SOCK_REUSEADDR;
|
|
|
0c50f5 |
int ret = 0;
|
|
|
0c50f5 |
|
|
|
0c50f5 |
@@ -244,6 +246,10 @@ int do_server(int *accept_sock, const ch
|
|
|
0c50f5 |
&& BIO_ADDRINFO_protocol(next) == sock_protocol) {
|
|
|
0c50f5 |
if (sock_family == AF_INET
|
|
|
0c50f5 |
&& BIO_ADDRINFO_family(next) == AF_INET6) {
|
|
|
0c50f5 |
+ /* In case AF_INET6 is returned but not supported by the
|
|
|
0c50f5 |
+ * kernel, retry with the first detected address family */
|
|
|
0c50f5 |
+ sock_family_fallback = sock_family;
|
|
|
0c50f5 |
+ sock_address_fallback = sock_address;
|
|
|
0c50f5 |
sock_family = AF_INET6;
|
|
|
0c50f5 |
sock_address = BIO_ADDRINFO_address(next);
|
|
|
0c50f5 |
} else if (sock_family == AF_INET6
|
|
|
0c50f5 |
@@ -253,6 +259,10 @@ int do_server(int *accept_sock, const ch
|
|
|
0c50f5 |
}
|
|
|
0c50f5 |
|
|
|
0c50f5 |
asock = BIO_socket(sock_family, sock_type, sock_protocol, 0);
|
|
|
0c50f5 |
+ if (asock == INVALID_SOCKET && sock_family_fallback != AF_UNSPEC) {
|
|
|
0c50f5 |
+ asock = BIO_socket(sock_family_fallback, sock_type, sock_protocol, 0);
|
|
|
0c50f5 |
+ sock_address = sock_address_fallback;
|
|
|
0c50f5 |
+ }
|
|
|
0c50f5 |
if (asock == INVALID_SOCKET
|
|
|
0c50f5 |
|| !BIO_listen(asock, sock_address, sock_options)) {
|
|
|
0c50f5 |
BIO_ADDRINFO_free(res);
|