From: Krzysztof Dynowski Date: Thu, 25 Jun 2015 08:52:35 +0000 (+0200) Subject: Wrapper: send/recv socket fd - based on public domain code X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=335d65d1e88c9c6af913724b720eea80a526f2c5;p=platform%2Fcore%2Fsecurity%2Fvasum.git Wrapper: send/recv socket fd - based on public domain code [Bug/Feature] Protex reported copy of code from LXC sources [Cause] Copied from vasum old api [Solution] Follow public domain examples from "Unix Network Programming" [Verification] Next protex report Change-Id: I13163a3e0ef68d816ad194e515cab28629a7291f --- diff --git a/wrapper/wrapper-compatibility.cpp b/wrapper/wrapper-compatibility.cpp index 942c5f6..6c3dfa9 100644 --- a/wrapper/wrapper-compatibility.cpp +++ b/wrapper/wrapper-compatibility.cpp @@ -211,65 +211,67 @@ API int sock_recv_fd(int fd, int *recvfd, void *data, size_t size) { LOGS(""); struct msghdr msg; struct iovec iov; + int ret; + union { + struct cmsghdr cm; + char control[CMSG_SPACE(sizeof(int))]; + } control_un; struct cmsghdr *cmsg; - char cmsgbuf[CMSG_SPACE(sizeof(int))]; - char buf[1]; - int ret, *val; + char dummy=1; memset(&msg, 0, sizeof(msg)); msg.msg_name = NULL; msg.msg_namelen = 0; - msg.msg_control = cmsgbuf; - msg.msg_controllen = sizeof(cmsgbuf); - iov.iov_base = data ? data : buf; - iov.iov_len = data ? size : sizeof(buf); + msg.msg_control = control_un.control; + msg.msg_controllen = sizeof(control_un.control); + + iov.iov_base = data ? data : &dummy; + iov.iov_len = data ? size : sizeof(dummy); msg.msg_iov = &iov; msg.msg_iovlen = 1; ret = recvmsg(fd, &msg, 0); if (ret <= 0) - goto out; + return ret; cmsg = CMSG_FIRSTHDR(&msg); - - *recvfd = -1; - if (cmsg && cmsg->cmsg_len == CMSG_LEN(sizeof(int)) && cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { - val = (int *)CMSG_DATA(cmsg); - *recvfd = *val; + *recvfd = *((int *)CMSG_DATA(cmsg)); } - out: - return ret; + else + *recvfd = -1; + return ret; } // sock_send_fd API int sock_send_fd(int fd, int sendfd, void *data, size_t size) { LOGS(""); struct msghdr msg; struct iovec iov; + union { + struct cmsghdr cm; + char control[CMSG_SPACE(sizeof(int))]; + } control_un; struct cmsghdr *cmsg; - char cmsgbuf[CMSG_SPACE(sizeof(int))]; - char buf[1]; - int *val; + char dummy=1; memset(&msg, 0, sizeof(msg)); - msg.msg_control = cmsgbuf; - msg.msg_controllen = sizeof(cmsgbuf); + msg.msg_control = control_un.control; + msg.msg_controllen = sizeof(control_un.control); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_len = CMSG_LEN(sizeof(int)); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; - val = (int *)(CMSG_DATA(cmsg)); - *val = sendfd; + *((int *)CMSG_DATA(cmsg)) = sendfd; msg.msg_name = NULL; msg.msg_namelen = 0; - iov.iov_base = data ? data : buf; - iov.iov_len = data ? size : sizeof(buf); + iov.iov_base = data ? data : &dummy; + iov.iov_len = data ? size : sizeof(dummy); msg.msg_iov = &iov; msg.msg_iovlen = 1;