krb5 commit: Only set SO_REUSEPORT on macOS

ghudson at mit.edu ghudson at mit.edu
Fri Apr 25 00:14:46 EDT 2025


https://github.com/krb5/krb5/commit/e21e17e200cc9ad874628d4d2a9d6b0d7dbdf5ea
commit e21e17e200cc9ad874628d4d2a9d6b0d7dbdf5ea
Author: Greg Hudson <ghudson at mit.edu>
Date:   Wed Apr 23 17:19:46 2025 -0400

    Only set SO_REUSEPORT on macOS
    
    Recent versions of the Linux kernel (after commit
    5b0af621c3f6ef9261cf6067812f2fd9943acb4b) return -1 with errno set to
    EOPNOTSUPP when a process attempts to set SO_REUSEPORT on a UNIX
    domain socket.  We started setting this flag in commit
    c423f13cc2f3fbdbf48390535cb1629b99b0eb27 to work around a test suite
    issue on macOS.  Restrict setting SO_REUSEPORT to macOS to avoid
    unnecessary interactions with its behavior on other platforms.

 src/kdc/t_sockact.c           | 2 +-
 src/lib/apputils/net-server.c | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/kdc/t_sockact.c b/src/kdc/t_sockact.c
index cb4a4bc7a..53a3b4d30 100644
--- a/src/kdc/t_sockact.c
+++ b/src/kdc/t_sockact.c
@@ -56,7 +56,7 @@ create_socket(const struct sockaddr *addr)
         abort();
     if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) != 0)
         abort();
-#ifdef SO_REUSEPORT
+#if defined(SO_REUSEPORT) && defined(__APPLE__)
     if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)) != 0)
         abort();
 #endif
diff --git a/src/lib/apputils/net-server.c b/src/lib/apputils/net-server.c
index c8c83606d..9b04cfd01 100644
--- a/src/lib/apputils/net-server.c
+++ b/src/lib/apputils/net-server.c
@@ -92,7 +92,9 @@ setreuseaddr(int sock, int value)
     st = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value));
     if (st)
         return st;
-#ifdef SO_REUSEPORT
+#if defined(SO_REUSEPORT) && defined(__APPLE__)
+    /* macOS experimentally needs this flag as well to avoid conflicts between
+     * recently exited server processes and new ones. */
     st = setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &value, sizeof(value));
     if (st)
         return st;


More information about the cvs-krb5 mailing list