[openssl-commits] [openssl] OpenSSL_1_1_0-stable update

bernd.edlinger at hotmail.de bernd.edlinger at hotmail.de
Thu Jan 25 14:21:53 UTC 2018


The branch OpenSSL_1_1_0-stable has been updated
       via  bfef66f000937a44cb769acce313e8504a5631b8 (commit)
      from  6672ca4e860a56973f5dfe502276e2f5709ddfca (commit)


- Log -----------------------------------------------------------------
commit bfef66f000937a44cb769acce313e8504a5631b8
Author: Bernd Edlinger <bernd.edlinger at hotmail.de>
Date:   Tue Jan 23 17:43:45 2018 +0100

    Make the s_server command listen on IPv6 only when requested
    
    Reviewed-by: Rich Salz <rsalz at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5152)
    
    (cherry picked from commit eee8a40aa5e06841eed6fa8eb4f6109238d59aea)

-----------------------------------------------------------------------

Summary of changes:
 apps/s_socket.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/apps/s_socket.c b/apps/s_socket.c
index e8fc37f..ee7e4eb 100644
--- a/apps/s_socket.c
+++ b/apps/s_socket.c
@@ -136,6 +136,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())
@@ -151,10 +155,27 @@ int do_server(int *accept_sock, const char *host, const char *port,
     OPENSSL_assert((family == AF_UNSPEC || family == BIO_ADDRINFO_family(res))
                    && (type == 0 || type == BIO_ADDRINFO_socktype(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)


More information about the openssl-commits mailing list