Increased the size of the sun_path field in a sockaddr_un structure to match the standard of 108 characters. Modified the bind/connect/sendto to adjust to this change

This commit is contained in:
Fabrizio Bertocci 2021-04-01 13:21:06 -04:00
parent f2b8cbdfb9
commit 5f2fce90e8
6 changed files with 41 additions and 19 deletions

View file

@ -41,10 +41,10 @@ int bind(int fd, const void *addr, uint32_t addrsize) {
if (!IsBsd()) {
return sys_bind(fd, addr, addrsize);
} else {
struct sockaddr_in_bsd addr2;
assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd));
memcpy(&addr2, addr, sizeof(struct sockaddr_in));
sockaddr2bsd(&addr2);
char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */
assert(addrsize <= sizeof(addr2));
memcpy(&addr2, addr, addrsize);
sockaddr2bsd(&addr2[0]);
return sys_bind(fd, &addr2, addrsize);
}
} else if (__isfdkind(fd, kFdSocket)) {

View file

@ -23,14 +23,13 @@
#include "libc/sysv/errfuns.h"
int sys_connect(int fd, const void *addr, uint32_t addrsize) {
if (addrsize != sizeof(struct sockaddr_in)) return einval();
if (!IsBsd()) {
return __sys_connect(fd, addr, addrsize);
} else {
struct sockaddr_in_bsd addr2;
assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd));
memcpy(&addr2, addr, sizeof(struct sockaddr_in));
sockaddr2bsd(&addr2);
return sys_connect(fd, &addr2, addrsize);
char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */
assert(addrsize <= sizeof(addr2));
memcpy(&addr2, addr, addrsize);
sockaddr2bsd(&addr2[0]);
return __sys_connect(fd, &addr2, addrsize);
}
}

View file

@ -49,7 +49,7 @@ struct msghdr_bsd {
struct sockaddr_un_bsd {
uint8_t sun_len; /* sockaddr len including NUL on freebsd but excluding it on openbsd/xnu */
uint8_t sun_family;
char sun_path[14];
char sun_path[108];
};
struct SockFd {

View file

@ -47,16 +47,15 @@
*/
ssize_t sendto(int fd, const void *buf, size_t size, uint32_t flags,
const void *opt_addr, uint32_t addrsize) {
assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd));
if (!IsWindows()) {
if (!IsBsd() || !opt_addr) {
return sys_sendto(fd, buf, size, flags, opt_addr, addrsize);
} else {
struct sockaddr_in_bsd addr2;
if (addrsize != sizeof(addr2)) return einval();
memcpy(&addr2, opt_addr, sizeof(struct sockaddr_in));
sockaddr2bsd(&addr2);
return sys_sendto(fd, buf, size, flags, &addr2, addrsize);
char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */
if (addrsize > sizeof(addr2)) return einval();
memcpy(&addr2, opt_addr, addrsize);
sockaddr2bsd(&addr2[0]);
return sys_sendto(fd, buf, size, flags, &addr2[0], addrsize);
}
} else if (__isfdkind(fd, kFdSocket)) {
return sys_sendto_nt(&g_fds.p[fd], (struct iovec[]){{buf, size}}, 1, flags,

View file

@ -42,7 +42,7 @@ struct sockaddr_in { /* Linux+NT ABI */
struct sockaddr_un {
uint16_t sun_family; /* AF_UNIX */
char sun_path[14];/* path */
char sun_path[108];/* path */
};
struct sockaddr_storage {

View file

@ -75,7 +75,12 @@ static void __openlog() {
log_fd = RegisterEventSourceA(NULL, log_ident);
} else {
log_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
if (log_fd >= 0) connect(log_fd, (void *)&log_addr, sizeof(log_addr));
if (log_fd >= 0) {
int rc = connect(log_fd, (void *)&log_addr, sizeof(log_addr));
if (rc < 0) {
printf("ERR: connect(openlog) failed: %s (errno=%d)\n", strerror(errno), errno);
}
}
}
}
@ -147,6 +152,8 @@ void vsyslog(int priority, const char *message, va_list ap) {
* - First try to send it to syslogd
* - If fails and LOG_CONS is provided, writes to /dev/console
*/
#if 0
if (send(log_fd, buf, l, 0) < 0 && (!is_lost_conn(errno)
|| connect(log_fd, (void *)&log_addr, sizeof(log_addr)) < 0
|| send(log_fd, buf, l, 0) < 0)
@ -157,6 +164,23 @@ void vsyslog(int priority, const char *message, va_list ap) {
close(fd);
}
}
#else
int rc = send(log_fd, buf, l, 0);
if (rc < 0) {
printf("ERR: send(1) failed: %s (errno=%d)\n", strerror(errno), errno);
if (!is_lost_conn(errno)) {
rc = connect(log_fd, (void *)&log_addr, sizeof(log_addr));
if (rc < 0) {
printf("ERR: connect(syslog) failed: %s (errno=%d)\n", strerror(errno), errno);
} else {
rc = send(log_fd, buf, l, 0);
if (rc < 0) {
printf("ERR: send(2) failed: %s (errno=%d)\n", strerror(errno), errno);
}
}
}
}
#endif
} else {
uint16_t evtType;
uint32_t evtID;