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()) { if (!IsBsd()) {
return sys_bind(fd, addr, addrsize); return sys_bind(fd, addr, addrsize);
} else { } else {
struct sockaddr_in_bsd addr2; char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */
assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd)); assert(addrsize <= sizeof(addr2));
memcpy(&addr2, addr, sizeof(struct sockaddr_in)); memcpy(&addr2, addr, addrsize);
sockaddr2bsd(&addr2); sockaddr2bsd(&addr2[0]);
return sys_bind(fd, &addr2, addrsize); return sys_bind(fd, &addr2, addrsize);
} }
} else if (__isfdkind(fd, kFdSocket)) { } else if (__isfdkind(fd, kFdSocket)) {

View file

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

View file

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

View file

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

View file

@ -75,7 +75,12 @@ static void __openlog() {
log_fd = RegisterEventSourceA(NULL, log_ident); log_fd = RegisterEventSourceA(NULL, log_ident);
} else { } else {
log_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); 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 * - First try to send it to syslogd
* - If fails and LOG_CONS is provided, writes to /dev/console * - 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) if (send(log_fd, buf, l, 0) < 0 && (!is_lost_conn(errno)
|| connect(log_fd, (void *)&log_addr, sizeof(log_addr)) < 0 || connect(log_fd, (void *)&log_addr, sizeof(log_addr)) < 0
|| send(log_fd, buf, l, 0) < 0) || send(log_fd, buf, l, 0) < 0)
@ -157,6 +164,23 @@ void vsyslog(int priority, const char *message, va_list ap) {
close(fd); 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 { } else {
uint16_t evtType; uint16_t evtType;
uint32_t evtID; uint32_t evtID;