aboutsummaryrefslogtreecommitdiff
path: root/sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c
diff options
context:
space:
mode:
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.c107
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)