krb5 commit: Fix KDC/kadmind startup on some IPv4-only systems

Greg Hudson ghudson at mit.edu
Mon Jan 9 11:07:19 EST 2017


https://github.com/krb5/krb5/commit/04c2bb56f5203b296b24314810eca02f5dc7e491
commit 04c2bb56f5203b296b24314810eca02f5dc7e491
Author: Greg Hudson <ghudson at mit.edu>
Date:   Mon Dec 26 15:09:24 2016 -0500

    Fix KDC/kadmind startup on some IPv4-only systems
    
    getaddrinfo(NULL, ...) may yield an IPv6 wildcard address on IPv4-only
    systems, and creating a socket for that address may result in an
    EAFNOSUPPORT error.  Tolerate that error as long as we can bind at
    least one socket for the address.
    
    ticket: 8531
    target_version: 1.15-next
    tags: pullup

 src/lib/apputils/net-server.c |   16 +++++++++++++---
 1 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/lib/apputils/net-server.c b/src/lib/apputils/net-server.c
index 171ecc4..d64ffdd 100644
--- a/src/lib/apputils/net-server.c
+++ b/src/lib/apputils/net-server.c
@@ -834,7 +834,7 @@ setup_addresses(struct socksetup *data)
     };
     krb5_error_code ret = 0;
     size_t i;
-    int err;
+    int err, bound_any;
     struct bind_address addr;
     struct addrinfo hints, *ai_list = NULL, *ai = NULL;
     verto_callback vcb;
@@ -871,8 +871,12 @@ setup_addresses(struct socksetup *data)
          * Loop through all the sockets that getaddrinfo could find to match
          * the requested address.  For wildcard listeners, this should usually
          * have two results, one for each of IPv4 and IPv6, or one or the
-         * other, depending on the system.
+         * other, depending on the system.  On IPv4-only systems, getaddrinfo()
+         * may return both IPv4 and IPv6 addresses, but creating an IPv6 socket
+         * may give an EAFNOSUPPORT error, so tolerate that error as long as we
+         * can bind at least one socket.
          */
+        bound_any = 0;
         for (ai = ai_list; ai != NULL; ai = ai->ai_next) {
             /* Make sure getaddrinfo returned a socket with the same type that
              * was requested. */
@@ -889,9 +893,15 @@ setup_addresses(struct socksetup *data)
                                  _("Failed setting up a %s socket (for %s)"),
                                  bind_type_names[addr.type],
                                  paddr(ai->ai_addr));
-                goto cleanup;
+                if (ret != EAFNOSUPPORT)
+                    goto cleanup;
+            } else {
+                bound_any = 1;
             }
         }
+        if (!bound_any)
+            goto cleanup;
+        ret = 0;
 
         if (ai_list != NULL)
             freeaddrinfo(ai_list);


More information about the cvs-krb5 mailing list