diff options
Diffstat (limited to 'sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c')
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c | 107 |
1 files changed, 81 insertions, 26 deletions
diff --git a/sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c b/sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c index d5ae5ef84c32..b4197166e32d 100644 --- a/sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c +++ b/sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c @@ -1,39 +1,66 @@ --- src/common/slurm_protocol_socket.c.orig 2024-05-21 17:19:51 UTC +++ src/common/slurm_protocol_socket.c -@@ -491,6 +491,27 @@ extern int slurm_init_msg_engine(slurm_addr_t *addr, b - extern int slurm_init_msg_engine(slurm_addr_t *addr, bool quiet) - { - int rc; +@@ -53,7 +53,9 @@ + #include <sys/socket.h> + #include <sys/time.h> + #include <sys/types.h> ++#include <sys/un.h> + #include <unistd.h> ++#include <fcntl.h> + + #include "slurm/slurm_errno.h" + #include "src/common/read_config.h" +@@ -74,6 +76,28 @@ + #define RANDOM_USER_PORT ((uint16_t) ((lrand48() % \ + (MAX_USER_PORT - MIN_USER_PORT + 1)) + MIN_USER_PORT)) + ++#if defined(__FreeBSD__) ++/* Normalize sockaddr length on FreeBSD and return the proper namelen */ ++static inline socklen_t _bsd_sockaddr_len_fix(struct sockaddr *sa) ++{ ++ if (!sa) return 0; ++ switch (sa->sa_family) { ++ case AF_INET: { ++ struct sockaddr_in *in = (struct sockaddr_in *)sa; ++ in->sin_len = (uint8_t)sizeof(*in); ++ return sizeof(*in); ++ } ++ case AF_INET6: { ++ struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)sa; ++ in6->sin6_len = (uint8_t)sizeof(*in6); ++ return sizeof(*in6); ++ } ++ default: ++ return sizeof(*sa); ++ } ++} ++#endif + + /* Static functions */ + static int _slurm_connect(int __fd, struct sockaddr const * __addr, + socklen_t __len); +@@ -115,8 +139,13 @@ static void _sock_bind_wild(int sockfd) + + slurm_setup_addr(&sin, RANDOM_USER_PORT); + ++ socklen_t blen = _bsd_sockaddr_len_fix((struct sockaddr *)&sin); + for (retry=0; retry < PORT_RETRIES ; retry++) { + #if defined(__FreeBSD__) -+ /* -+ * FreeBSD requires the sa_len field to be set correctly in -+ * struct sockaddr_in / sockaddr_in6 before calling bind(). -+ * If it is unset, bind() may fail with EINVAL. -+ * -+ * This adjustment ensures the correct length is set based -+ * on the address family before bind() is called. -+ */ -+ if (addr->ss_family == AF_INET) { -+ ((struct sockaddr_in *)addr)->sin_len = sizeof(struct sockaddr_in); -+ } else if (addr->ss_family == AF_INET6) { -+ ((struct sockaddr_in6 *)addr)->sin6_len = sizeof(struct sockaddr_in6); -+ } -+ -+ /* Track the correct length for bind() */ -+ socklen_t bind_len = (addr->ss_family == AF_INET6) -+ ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); ++ rc = bind(sockfd, (struct sockaddr *) &sin, blen); ++ #else + rc = bind(sockfd, (struct sockaddr *) &sin, sizeof(sin)); + #endif -+ - int fd; - int log_lvl = LOG_LEVEL_ERROR; - const int one = 1; -@@ -511,7 +532,11 @@ extern int slurm_init_msg_engine(slurm_addr_t *addr, b + if (rc >= 0) + break; + slurm_set_port(&sin, RANDOM_USER_PORT); +@@ -511,7 +540,13 @@ extern int slurm_init_msg_engine(slurm_addr_t *addr, b goto error; } - rc = bind(fd, (struct sockaddr const *) addr, sizeof(*addr)); + #if defined(__FreeBSD__) ++ /* FreeBSD: normalize sa_len and pass the exact namelen to bind() */ ++ socklen_t bind_len = _bsd_sockaddr_len_fix((struct sockaddr *)addr); + rc = bind(fd, (struct sockaddr const *) addr, bind_len); + #else + rc = bind(fd, (struct sockaddr const *) addr, sizeof(*addr)); @@ -41,3 +68,31 @@ if (rc < 0) { format_print(log_lvl, "Error binding slurm stream socket: %m"); goto error; +@@ -666,7 +701,27 @@ static int _slurm_connect (int __fd, struct sockaddr c + if (fcntl(__fd, F_SETFL, flags | O_NONBLOCK) < 0) + error("%s: fcntl(F_SETFL) error: %m", __func__); + ++/* FreeBSD requires correct sa_len/namelen; recompute here */ ++#if defined(__FreeBSD__) ++ { ++ struct sockaddr *sa = (struct sockaddr *)__addr; ++ socklen_t namelen; ++ switch (sa->sa_family) { ++ case AF_UNIX: { ++ struct sockaddr_un *un = (struct sockaddr_un *)sa; ++ namelen = (socklen_t)SUN_LEN(un); ++ un->sun_len = (uint8_t)namelen; ++ break; ++ } ++ default: ++ namelen = _bsd_sockaddr_len_fix(sa); ++ break; ++ } ++ rc = connect(__fd, sa, namelen); ++ } ++#else + rc = connect(__fd , __addr , __len); ++#endif + if ((rc < 0) && (errno != EINPROGRESS)) + return errno; + if (rc == 0) |