89 lines
3.1 KiB
C
89 lines
3.1 KiB
C
--- src/common/slurm_protocol_socket.c.orig 2026-01-15 20:26:01 UTC
|
|
+++ src/common/slurm_protocol_socket.c
|
|
@@ -64,6 +64,7 @@
|
|
#include "src/common/read_config.h"
|
|
#include "src/common/slurm_protocol_api.h"
|
|
#include "src/common/slurm_protocol_socket.h"
|
|
+#include "src/common/slurm_sockaddr.h"
|
|
#include "src/common/slurm_time.h"
|
|
#include "src/common/strlcpy.h"
|
|
#include "src/common/util-net.h"
|
|
@@ -107,7 +108,9 @@ static void _sock_bind_wild(int sockfd)
|
|
slurm_setup_addr(&sin, RANDOM_USER_PORT);
|
|
|
|
for (retry=0; retry < PORT_RETRIES ; retry++) {
|
|
- rc = bind(sockfd, (struct sockaddr *) &sin, sizeof(sin));
|
|
+ socklen_t blen = slurm_sockaddr_fixlen(
|
|
+ (struct sockaddr *)&sin, (socklen_t)sizeof(sin));
|
|
+ rc = bind(sockfd, (struct sockaddr *)&sin, blen);
|
|
if (rc >= 0)
|
|
break;
|
|
slurm_set_port(&sin, RANDOM_USER_PORT);
|
|
@@ -543,26 +546,30 @@ extern int slurm_init_msg_engine(slurm_addr_t *addr, b
|
|
|
|
extern int slurm_init_msg_engine(slurm_addr_t *addr, bool quiet)
|
|
{
|
|
- socklen_t bind_len = (addr->ss_family == AF_INET6) ?
|
|
- sizeof(struct sockaddr_in6) :
|
|
- sizeof(struct sockaddr_in);
|
|
int rc;
|
|
int fd;
|
|
int log_lvl = LOG_LEVEL_ERROR;
|
|
const int one = 1;
|
|
const size_t sz1 = sizeof(one);
|
|
+ socklen_t bind_len = slurm_sockaddr_fixlen((struct sockaddr *)addr,
|
|
+ (socklen_t)sizeof(*addr));
|
|
+
|
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
|
|
- /*
|
|
- * The BSDs requires the sa_len field to be set correctly in
|
|
- * struct sockaddr_in / sockaddr_in6 before calling bind().
|
|
- * If unset, bind() may fail with EINVAL.
|
|
- */
|
|
+/*
|
|
+ * Fallback: if configure didn't detect any sockaddr length fields,
|
|
+ * preserve the historical BSD workaround.
|
|
+ */
|
|
+#if !defined(HAVE_STRUCT_SOCKADDR_IN_SIN_LEN) && \
|
|
+ !defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN) && \
|
|
+ !defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
|
|
if (addr->ss_family == AF_INET)
|
|
- ((struct sockaddr_in *) addr)->sin_len = bind_len;
|
|
+ ((struct sockaddr_in *)addr)->sin_len =
|
|
+ (uint8_t)sizeof(struct sockaddr_in);
|
|
else if (addr->ss_family == AF_INET6)
|
|
- ((struct sockaddr_in6 *) addr)->sin6_len = bind_len;
|
|
+ ((struct sockaddr_in6 *)addr)->sin6_len =
|
|
+ (uint8_t)sizeof(struct sockaddr_in6);
|
|
#endif
|
|
-
|
|
+#endif
|
|
if (quiet)
|
|
log_lvl = LOG_LEVEL_DEBUG;
|
|
|
|
@@ -688,8 +695,10 @@ extern int slurm_open_stream(slurm_addr_t *addr, bool
|
|
_sock_bind_wild(fd);
|
|
}
|
|
|
|
- rc = _slurm_connect(fd, (struct sockaddr const *)addr,
|
|
- sizeof(*addr));
|
|
+ slurm_addr_t tmp = *addr;
|
|
+ socklen_t alen = slurm_sockaddr_fixlen(
|
|
+ (struct sockaddr *)&tmp, (socklen_t)sizeof(tmp));
|
|
+ rc = _slurm_connect(fd, (struct sockaddr const *)&tmp, alen);
|
|
if (!rc) {
|
|
/* success */
|
|
break;
|
|
@@ -756,8 +765,10 @@ extern int slurm_open_unix_stream(char *addr_name, int
|
|
memset(&sa, 0, sizeof(sa));
|
|
sa.sun_family = AF_UNIX;
|
|
strcpy(sa.sun_path, addr_name);
|
|
+ socklen_t slen = slurm_sockaddr_fixlen((struct sockaddr *)&sa,
|
|
+ (socklen_t)sizeof(sa));
|
|
|
|
- while ((rc = connect(*fd, (struct sockaddr *) &sa, SUN_LEN(&sa))) &&
|
|
+ while ((rc = connect(*fd, (struct sockaddr *)&sa, slen)) &&
|
|
(errno == EINTR))
|
|
; /* empty loop */
|
|
|