diff --git a/src/lxc/af_unix.c b/src/lxc/af_unix.c index 7ab499a4f..f70eca333 100644 --- a/src/lxc/af_unix.c +++ b/src/lxc/af_unix.c @@ -212,20 +212,18 @@ int lxc_unix_send_fds(int fd, int *sendfds, int num_sendfds, void *data, return lxc_abstract_unix_send_fds(fd, sendfds, num_sendfds, data, size); } -int lxc_abstract_unix_recv_fds(int fd, int *recvfds, int num_recvfds, - void *data, size_t size) +static int lxc_abstract_unix_recv_fds_iov(int fd, int *recvfds, int num_recvfds, + struct iovec *iov, size_t iovlen) { __do_free char *cmsgbuf = NULL; int ret; struct msghdr msg; - struct iovec iov; struct cmsghdr *cmsg = NULL; char buf[1] = {0}; size_t cmsgbufsize = CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(num_recvfds * sizeof(int)); memset(&msg, 0, sizeof(msg)); - memset(&iov, 0, sizeof(iov)); cmsgbuf = malloc(cmsgbufsize); if (!cmsgbuf) { @@ -236,10 +234,8 @@ int lxc_abstract_unix_recv_fds(int fd, int *recvfds, int num_recvfds, msg.msg_control = cmsgbuf; msg.msg_controllen = cmsgbufsize; - iov.iov_base = data ? data : buf; - iov.iov_len = data ? size : sizeof(buf); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; + msg.msg_iov = iov; + msg.msg_iovlen = iovlen; again: ret = recvmsg(fd, &msg, 0); @@ -271,6 +267,17 @@ out: return ret; } +int lxc_abstract_unix_recv_fds(int fd, int *recvfds, int num_recvfds, + void *data, size_t size) +{ + char buf[1] = {0}; + struct iovec iov = { + .iov_base = data ? data : buf, + .iov_len = data ? size : sizeof(buf), + }; + return lxc_abstract_unix_recv_fds_iov(fd, recvfds, num_recvfds, &iov, 1); +} + int lxc_abstract_unix_send_credential(int fd, void *data, size_t size) { struct msghdr msg = {0};