summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2018-01-23 17:43:45 +0100
committerBernd Edlinger <bernd.edlinger@hotmail.de>2018-01-25 15:17:59 +0100
commiteee8a40aa5e06841eed6fa8eb4f6109238d59aea (patch)
tree8b2e4773afe435c823b7d64ec17b8e3bebd9e693 /apps
parentf1a0f9faa2a59835d962ade5acd731f85fbf3e6a (diff)
Make the s_server command listen on IPv6 only when requested
Reviewed-by: Rich Salz <rsalz@openssl.org> (Merged from https://github.com/openssl/openssl/pull/5152)
Diffstat (limited to 'apps')
-rw-r--r--apps/s_socket.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/apps/s_socket.c b/apps/s_socket.c
index a9e46f9949..4f1e751378 100644
--- a/apps/s_socket.c
+++ b/apps/s_socket.c
@@ -161,6 +161,10 @@ int do_server(int *accept_sock, const char *host, const char *port,
int sock;
int i;
BIO_ADDRINFO *res = NULL;
+ const BIO_ADDRINFO *next;
+ int sock_family, sock_type, sock_protocol;
+ const BIO_ADDR *sock_address;
+ int sock_options = BIO_SOCK_REUSEADDR;
int ret = 0;
if (BIO_sock_init() != 1)
@@ -178,10 +182,27 @@ int do_server(int *accept_sock, const char *host, const char *port,
&& (type == 0 || type == BIO_ADDRINFO_socktype(res))
&& (protocol == 0 || protocol == BIO_ADDRINFO_protocol(res)));
- asock = BIO_socket(BIO_ADDRINFO_family(res), BIO_ADDRINFO_socktype(res),
- BIO_ADDRINFO_protocol(res), 0);
+ sock_family = BIO_ADDRINFO_family(res);
+ sock_type = BIO_ADDRINFO_socktype(res);
+ sock_protocol = BIO_ADDRINFO_protocol(res);
+ sock_address = BIO_ADDRINFO_address(res);
+ next = BIO_ADDRINFO_next(res);
+ if(sock_family == AF_INET6)
+ sock_options |= BIO_SOCK_V6_ONLY;
+ if (next != NULL
+ && BIO_ADDRINFO_socktype(next) == sock_type
+ && BIO_ADDRINFO_protocol(next) == sock_protocol) {
+ if (sock_family == AF_INET && BIO_ADDRINFO_family(next) == AF_INET6) {
+ sock_family = AF_INET6;
+ sock_address = BIO_ADDRINFO_address(next);
+ }
+ else if (sock_family == AF_INET6 && BIO_ADDRINFO_family(next) == AF_INET)
+ sock_options &= ~BIO_SOCK_V6_ONLY;
+ }
+
+ asock = BIO_socket(sock_family, sock_type, sock_protocol, 0);
if (asock == INVALID_SOCKET
- || !BIO_listen(asock, BIO_ADDRINFO_address(res), BIO_SOCK_REUSEADDR)) {
+ || !BIO_listen(asock, sock_address, sock_options)) {
BIO_ADDRINFO_free(res);
ERR_print_errors(bio_err);
if (asock != INVALID_SOCKET)