From nobody Fri Jun 17 19:41:12 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id C75E785D8BB; Fri, 17 Jun 2022 19:41:13 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LPqCr3lbKz3jCj; Fri, 17 Jun 2022 19:41:12 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494873; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=khWhIFaqX0mEvQKoRubfdSzAV3RHkTI8fptFTlI9fw0=; b=Q3vc/zQBQmFwm1qscz3j3hEAk/yAmXvZdqxEbsDxpl2AlfhUa98EF+jb4LOO3ILMobLfLl hfYLeqsN9jiWBaPLmkQZ2XYWJo1UCw18nHg1oECI+dXwej3pZ5ziCkoRDvuxV8PUWl0xXo 1cpQ43QhY4rrzsc0vq7RZUdXoFZXXotRcMd3KnDHHBrMCjpN4NfKj3QfP97hzBFMgz8WRT OLBWCeRy9r+hpMt7EK0/7SdmK73Hi+qkwzOsiHmeNUuSLVl6UhW3FfXg4YQQw37cgVqdx7 ftZmDUNgRHTCz2SEvACK/zL+urw4CMdVDhlKNpbMdIXpdITcOCBPnmQqOOydPQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 3623A25A65; Fri, 17 Jun 2022 19:41:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 25HJfCC6030161; Fri, 17 Jun 2022 19:41:12 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25HJfCe7030160; Fri, 17 Jun 2022 19:41:12 GMT (envelope-from git) Date: Fri, 17 Jun 2022 19:41:12 GMT Message-Id: <202206171941.25HJfCe7030160@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Dmitry Chagin Subject: git: ac37e0edf97a - stable/13 - linux(4): Improve recvmsg() readability List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dchagin X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: ac37e0edf97ace6a2dfc8271af94bdb096880cc2 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494873; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=khWhIFaqX0mEvQKoRubfdSzAV3RHkTI8fptFTlI9fw0=; b=d+XFzBJPHv5fm7lCpp4lsB3vki5sZehhK1tGz+RzEu9/c7MiHg/6XfurtgP4WPR3DPuosX t3XJ/2In5GLB/oE5NGnj/rqwn2+Rm6IniE71VnV+gLgaPzAeSv6/diVGB5oJ62jewvxSmp OloViVyHXKUzdlgxPMqsX4+9JwmQs0z+15IaRbkjAMUEhLZJ97KGO698VGy6f0Gbk1s7+P uApPzKQbEGIxcKLmQEWMh0wcJPw+GYJGfYwOWgf/Gkyrzr9c1HYuLuKxNZBwJWDmsa/jrG +jBzWYbEawaX45UEz6FfvuaoN/rIzvWO4wAv9z1/BEt0AkGZFZLnjENgPe6AWw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1655494873; a=rsa-sha256; cv=none; b=PwKic9OM7xdDiNfl2f08dpWJpbA1FXYnLk/5Tfny++4f5FqndDdJcYiEGXtC1D+vI//tpq v64kfRHsnAC4uXewlV2U/2kzA5Iu9zwiaQyD5axjpiK3cQjA3Ys9eiL27jkVh1cmwv12Kl ffr66XWLpu77baTW0ncVqM8h9MK+1I5AdRW0m58AqracINecDINnxXc7Zs+GhqeelFYYIe XHwHDAouTm2KwmWhG2pBozGva7izEDTvEJtfqbc4GaDlWIwi8vwSOHwfY3lUsI1ZNiROM5 sjxIp+09Gk0KMku8WNZUZtY4fICu1jb3pkxRer+bS7kZ4DCW0Jd+URqUKXhwNA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=ac37e0edf97ace6a2dfc8271af94bdb096880cc2 commit ac37e0edf97ace6a2dfc8271af94bdb096880cc2 Author: Dmitry Chagin AuthorDate: 2022-05-28 20:44:02 +0000 Commit: Dmitry Chagin CommitDate: 2022-06-17 19:35:34 +0000 linux(4): Improve recvmsg() readability To improve recvmsg() readability SCM_ handlers moved to a separate functions. MFC after: 2 weeks (cherry picked from commit b408788d6b7edf91a6c4b9e2e8d1b34fe5d41525) --- sys/compat/linux/linux_socket.c | 154 +++++++++++++++++++++++++--------------- 1 file changed, 95 insertions(+), 59 deletions(-) diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index 71f958b57298..4dee89d1ebd6 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -1532,26 +1532,90 @@ linux_sendmmsg(struct thread *td, struct linux_sendmmsg_args *args) return (error); } +static int +recvmsg_scm_rights(struct thread *td, l_uint flags, socklen_t *datalen, + void **data, void **udata) +{ + int i, fd, fds, *fdp; + + if (flags & LINUX_MSG_CMSG_CLOEXEC) { + fds = *datalen / sizeof(int); + fdp = *data; + for (i = 0; i < fds; i++) { + fd = *fdp++; + (void)kern_fcntl(td, fd, F_SETFD, FD_CLOEXEC); + } + } + return (0); +} + +static int +recvmsg_scm_creds(socklen_t *datalen, void **data, void **udata) +{ + struct cmsgcred *cmcred; + struct l_ucred lu; + + cmcred = *data; + lu.pid = cmcred->cmcred_pid; + lu.uid = cmcred->cmcred_uid; + lu.gid = cmcred->cmcred_gid; + memmove(*data, &lu, sizeof(lu)); + *datalen = sizeof(lu); + return (0); +} +_Static_assert(sizeof(struct cmsgcred) >= sizeof(struct l_ucred), + "scm_creds sizeof l_ucred"); + +static int +recvmsg_scm_creds2(socklen_t *datalen, void **data, void **udata) +{ + struct sockcred2 *scred; + struct l_ucred lu; + + scred = *data; + lu.pid = scred->sc_pid; + lu.uid = scred->sc_uid; + lu.gid = scred->sc_gid; + memmove(*data, &lu, sizeof(lu)); + *datalen = sizeof(lu); + return (0); +} +_Static_assert(sizeof(struct sockcred2) >= sizeof(struct l_ucred), + "scm_creds2 sizeof l_ucred"); + +static int +recvmsg_scm_timestamp(socklen_t *datalen, void **data, void **udata) +{ + struct timeval *ftmvl; + l_timeval *ltv; + + if (*datalen != sizeof(struct timeval)) + return (EMSGSIZE); + + ftmvl = *data; + ltv = malloc(sizeof(*ltv), M_LINUX, M_WAITOK); + ltv->tv_sec = ftmvl->tv_sec; + ltv->tv_usec = ftmvl->tv_usec; + *data = *udata = ltv; + *datalen = sizeof(*ltv); + return (0); +} + static int linux_recvmsg_common(struct thread *td, l_int s, struct l_msghdr *msghdr, l_uint flags, struct msghdr *msg) { struct cmsghdr *cm; - struct cmsgcred *cmcred; - struct sockcred2 *scred; struct l_cmsghdr *linux_cmsg = NULL; - struct l_ucred linux_ucred; socklen_t datalen, maxlen, outlen; struct l_msghdr linux_msghdr; struct iovec *iov, *uiov; struct mbuf *control = NULL; struct mbuf **controlp; - struct timeval *ftmvl; struct sockaddr *sa; - l_timeval ltmvl; caddr_t outbuf; - void *data; - int error, i, fd, fds, *fdp; + void *data, *udata; + int error; error = copyin(msghdr, &linux_msghdr, sizeof(linux_msghdr)); if (error != 0) @@ -1635,69 +1699,40 @@ linux_recvmsg_common(struct thread *td, l_int s, struct l_msghdr *msghdr, data = CMSG_DATA(cm); datalen = (caddr_t)cm + cm->cmsg_len - (caddr_t)data; + udata = NULL; switch (cm->cmsg_type) { case SCM_RIGHTS: - if (flags & LINUX_MSG_CMSG_CLOEXEC) { - fds = datalen / sizeof(int); - fdp = data; - for (i = 0; i < fds; i++) { - fd = *fdp++; - (void)kern_fcntl(td, fd, - F_SETFD, FD_CLOEXEC); - } - } + error = recvmsg_scm_rights(td, flags, + &datalen, &data, &udata); break; case SCM_CREDS: - /* - * Currently LOCAL_CREDS is never in - * effect for Linux so no need to worry - * about sockcred - */ - if (datalen != sizeof(*cmcred)) { - error = EMSGSIZE; - goto bad; - } - cmcred = (struct cmsgcred *)data; - bzero(&linux_ucred, sizeof(linux_ucred)); - linux_ucred.pid = cmcred->cmcred_pid; - linux_ucred.uid = cmcred->cmcred_uid; - linux_ucred.gid = cmcred->cmcred_gid; - data = &linux_ucred; - datalen = sizeof(linux_ucred); + error = recvmsg_scm_creds(&datalen, + &data, &udata); break; case SCM_CREDS2: - scred = data; - bzero(&linux_ucred, sizeof(linux_ucred)); - linux_ucred.pid = scred->sc_pid; - linux_ucred.uid = scred->sc_uid; - linux_ucred.gid = scred->sc_gid; - data = &linux_ucred; - datalen = sizeof(linux_ucred); + error = recvmsg_scm_creds2(&datalen, + &data, &udata); break; case SCM_TIMESTAMP: - if (datalen != sizeof(struct timeval)) { - error = EMSGSIZE; - goto bad; - } - ftmvl = (struct timeval *)data; - ltmvl.tv_sec = ftmvl->tv_sec; - ltmvl.tv_usec = ftmvl->tv_usec; - data = <mvl; - datalen = sizeof(ltmvl); + error = recvmsg_scm_timestamp(&datalen, + &data, &udata); break; } + if (error != 0) + goto bad; if (outlen + LINUX_CMSG_LEN(datalen) > maxlen) { if (outlen == 0) { error = EMSGSIZE; - goto bad; + goto err; } else { linux_msghdr.msg_flags |= LINUX_MSG_CTRUNC; m_dispose_extcontrolm(control); + free(udata, M_LINUX); goto out; } } @@ -1705,18 +1740,19 @@ linux_recvmsg_common(struct thread *td, l_int s, struct l_msghdr *msghdr, linux_cmsg->cmsg_len = LINUX_CMSG_LEN(datalen); error = copyout(linux_cmsg, outbuf, L_CMSG_HDRSZ); + if (error == 0) { + outbuf += L_CMSG_HDRSZ; + error = copyout(data, outbuf, datalen); + if (error == 0) { + outbuf += LINUX_CMSG_ALIGN(datalen); + outlen += LINUX_CMSG_LEN(datalen); + cm = CMSG_NXTHDR(msg, cm); + } + } +err: + free(udata, M_LINUX); if (error != 0) goto bad; - outbuf += L_CMSG_HDRSZ; - - error = copyout(data, outbuf, datalen); - if (error != 0) - goto bad; - - outbuf += LINUX_CMSG_ALIGN(datalen); - outlen += LINUX_CMSG_LEN(datalen); - - cm = CMSG_NXTHDR(msg, cm); } linux_msghdr.msg_controllen = outlen; }