diff options
Diffstat (limited to 'src/libunixonacid')
-rw-r--r-- | src/libunixonacid/ancil_recv_fd.c | 9 | ||||
-rw-r--r-- | src/libunixonacid/ancil_send_fd.c | 2 |
2 files changed, 7 insertions, 4 deletions
diff --git a/src/libunixonacid/ancil_recv_fd.c b/src/libunixonacid/ancil_recv_fd.c index 70f2c4f..5ecbb31 100644 --- a/src/libunixonacid/ancil_recv_fd.c +++ b/src/libunixonacid/ancil_recv_fd.c @@ -4,6 +4,7 @@ #include <skalibs/nonposix.h> #include <errno.h> +#include <string.h> #include <sys/uio.h> #include <sys/socket.h> @@ -33,6 +34,7 @@ int ancil_recv_fd (int sock, char expected_ch) 0 #endif ; + int fd ; struct cmsghdr *c ; ssize_t r ; char ch ; @@ -58,12 +60,13 @@ int ancil_recv_fd (int sock, char expected_ch) || c->cmsg_level != SOL_SOCKET || c->cmsg_type != SCM_RIGHTS || (size_t)(c->cmsg_len - (CMSG_DATA(c) - (unsigned char *)c)) != sizeof(int)) return (errno = EPROTO, -1) ; + memcpy(&fd, CMSG_DATA(c), sizeof(int)) ; #ifndef SKALIBS_HASCMSGCLOEXEC - if (coe(*(int *)CMSG_DATA(c)) < 0) + if (coe(fd) < 0) { - fd_close(*(int *)CMSG_DATA(c)) ; + fd_close(fd) ; return -1 ; } #endif - return *(int *)CMSG_DATA(c) ; + return fd ; } diff --git a/src/libunixonacid/ancil_send_fd.c b/src/libunixonacid/ancil_send_fd.c index 939d06c..5573d5c 100644 --- a/src/libunixonacid/ancil_send_fd.c +++ b/src/libunixonacid/ancil_send_fd.c @@ -35,7 +35,7 @@ int ancil_send_fd (int sock, int fd, char ch) c->cmsg_level = SOL_SOCKET ; c->cmsg_type = SCM_RIGHTS ; c->cmsg_len = CMSG_LEN(sizeof(int)) ; - *(int *)CMSG_DATA(c) = fd ; + memcpy(CMSG_DATA(c), &fd, sizeof(int)) ; do r = sendmsg(sock, &hdr, MSG_NOSIGNAL) ; while (r < 0 && errno == EINTR) ; if (r <= 0) return 0 ; |