From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40724) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W5419-0003xR-S7 for qemu-devel@nongnu.org; Sun, 19 Jan 2014 20:51:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W5410-0004Ul-UM for qemu-devel@nongnu.org; Sun, 19 Jan 2014 20:51:11 -0500 Received: from e28smtp09.in.ibm.com ([122.248.162.9]:38414) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W5410-0004ST-Ca for qemu-devel@nongnu.org; Sun, 19 Jan 2014 20:51:02 -0500 Received: from /spool/local by e28smtp09.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 20 Jan 2014 07:20:58 +0530 Received: from d28relay04.in.ibm.com (d28relay04.in.ibm.com [9.184.220.61]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id B81C7394003F for ; Mon, 20 Jan 2014 07:20:55 +0530 (IST) Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65]) by d28relay04.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s0K1or1756099060 for ; Mon, 20 Jan 2014 07:20:53 +0530 Received: from d28av03.in.ibm.com (localhost [127.0.0.1]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s0K1oswO022907 for ; Mon, 20 Jan 2014 07:20:54 +0530 Message-ID: <52DC80FB.6000905@linux.vnet.ibm.com> Date: Mon, 20 Jan 2014 09:50:51 +0800 From: Lei Li MIME-Version: 1.0 References: <1389172376-30636-1-git-send-email-lilei@linux.vnet.ibm.com> <1389172376-30636-2-git-send-email-lilei@linux.vnet.ibm.com> <20140117100202.GA30040@redhat.com> In-Reply-To: <20140117100202.GA30040@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/6] qemu-fd-exchange: provide common methods for exchange fd List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Daniel P. Berrange" Cc: pbonzini@redhat.com, mohan@in.ibm.com, qemu-devel@nongnu.org On 01/17/2014 06:02 PM, Daniel P. Berrange wrote: > On Wed, Jan 08, 2014 at 05:12:51PM +0800, Lei Li wrote: >> Signed-off-by: Lei Li >> --- >> include/qemu/fd-exchange.h | 25 +++++++++++ >> util/Makefile.objs | 1 + >> util/qemu-fd-exchange.c | 97 ++++++++++++++++++++++++++++++++++++++++++++ >> 3 files changed, 123 insertions(+), 0 deletions(-) >> create mode 100644 include/qemu/fd-exchange.h >> create mode 100644 util/qemu-fd-exchange.c >> >> diff --git a/include/qemu/fd-exchange.h b/include/qemu/fd-exchange.h >> new file mode 100644 >> index 0000000..6929026 >> --- /dev/null >> +++ b/include/qemu/fd-exchange.h >> @@ -0,0 +1,25 @@ >> +/* >> + * Internel common methods for exchange of FD >> + * >> + * This work is licensed under the terms of the GNU GPL, version 2. See >> + * the COPYING file in the top-level directory. >> + * >> + */ >> + >> +#ifndef FD_EXCHANGE_H >> +#define FD_EXCHANGE_H >> + >> +#include >> + >> +union MsgControl { >> + struct cmsghdr cmsg; >> + char control[CMSG_SPACE(sizeof(int))]; >> +}; >> + >> +ssize_t qemu_send_with_fd(int sockfd, int passed_fd, >> + const void *buf, size_t len); >> + >> +ssize_t qemu_recv_with_fd(int sockfd, int *passed_fd, >> + void *buf, size_t len); >> + >> +#endif >> diff --git a/util/Makefile.objs b/util/Makefile.objs >> index af3e5cb..2fb42bf 100644 >> --- a/util/Makefile.objs >> +++ b/util/Makefile.objs >> @@ -13,3 +13,4 @@ util-obj-y += hexdump.o >> util-obj-y += crc32c.o >> util-obj-y += throttle.o >> util-obj-y += getauxval.o >> +util-obj-y += qemu-fd-exchange.o >> diff --git a/util/qemu-fd-exchange.c b/util/qemu-fd-exchange.c >> new file mode 100644 >> index 0000000..70a3206 >> --- /dev/null >> +++ b/util/qemu-fd-exchange.c >> @@ -0,0 +1,97 @@ >> +/* >> + * Internel common methods for exchange of FD >> + * >> + * This work is licensed under the terms of the GNU GPL, version 2. See >> + * the COPYING file in the top-level directory. >> + * >> + */ >> + >> +#include "qemu/fd-exchange.h" >> +#include "qemu-common.h" >> + >> + >> +ssize_t qemu_send_with_fd(int sockfd, int passed_fd, >> + const void *buf, size_t len) >> +{ >> + struct msghdr msg; >> + struct iovec iov; >> + struct cmsghdr *cmsg; >> + union MsgControl msg_control; >> + int retval; >> + >> + iov.iov_base = (int *)buf; >> + iov.iov_len = len; >> + >> + memset(&msg, 0, sizeof(msg)); >> + msg.msg_iov = &iov; >> + msg.msg_iovlen = len; >> + msg.msg_control = &msg_control; >> + msg.msg_controllen = sizeof(msg_control); >> + >> + if (passed_fd < 0) { >> + *(int *)buf = passed_fd; > You are casting 'char *buf' to an 'int *' but many of the > callers only pass in a pointer to a 'char buf[1]'. So you > are overflowing the array and also likely causing alignment > violations on ARM platforms. You are right, will fix it. Thanks. > >> + } else { >> + msg.msg_control = &msg_control; >> + msg.msg_controllen = sizeof(msg_control); >> + >> + cmsg = &msg_control.cmsg; >> + cmsg->cmsg_len = CMSG_LEN(sizeof(passed_fd)); >> + cmsg->cmsg_level = SOL_SOCKET; >> + cmsg->cmsg_type = SCM_RIGHTS; >> + memcpy(CMSG_DATA(cmsg), &passed_fd, sizeof(passed_fd)); >> + >> + } >> + >> + do { >> + retval = sendmsg(sockfd, &msg, 0); >> + } while (retval < 0 && errno == EINTR); >> + >> + return retval; >> +} >> + >> +ssize_t qemu_recv_with_fd(int sockfd, int *passed_fd, >> + void *buf, size_t len) >> +{ >> + struct iovec iov; >> + struct msghdr msg; >> + struct cmsghdr *cmsg; >> + union MsgControl msg_control; >> + int retval; >> + int data = *(int *)buf; >> + >> + iov.iov_base = buf; >> + iov.iov_len = len; >> + >> + memset(&msg, 0, sizeof(msg)); >> + msg.msg_iov = &iov; >> + msg.msg_iovlen = 1; >> + msg.msg_control = &msg_control; >> + msg.msg_controllen = sizeof(msg_control); >> + >> + do { >> + retval = recvmsg(sockfd, &msg, 0); >> + } while (retval < 0 && errno == EINTR); >> + >> + if (retval <= 0) { >> + return retval; >> + } >> + >> + if (data != *(int *)buf) { >> + *passed_fd = data; >> + return 0; >> + } > Again cast issues > >> + >> + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { >> + if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)) || >> + cmsg->cmsg_level != SOL_SOCKET || >> + cmsg->cmsg_type != SCM_RIGHTS) { >> + continue; >> + } >> + >> + memcpy(passed_fd, CMSG_DATA(cmsg), sizeof(*passed_fd)); >> + return 0; >> + } >> + >> + *passed_fd = -ENFILE; >> + return retval; >> +} >> -- > Regards, > Daniel -- Lei