From nobody Sat May 28 20:53:21 2022 X-Original-To: dev-commits-src-main@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 D19941B500C2; Sat, 28 May 2022 20:53:22 +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 4L9YmL25Z1z4lDQ; Sat, 28 May 2022 20:53:22 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653771202; 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=jabhuLllvMk05kCekcg6LKoNqIVz8wEubd+mlJSL3Gc=; b=qbq3EC5TGlJLWqK1XyfxROrCwHkZAB1fFp/Op1PaTsk5xDGonwLyqBgmFqJztsvLRiGN3F yQk3vm1PpwIQBzZE+wQCuqtVSs6IQrlO5W2GZPgiZe4XdWe20b7DEGgPBU9S9EboNxe144 o0vTArX7PGEr3Q1sLZxDS4l5DEKK7HaY6vKaoy2KQDUouSvn9U8HoWhBIbHjZWUqzQMDjL wvrc3+isAH87l3iRU+9/PQwdRbNhUkOsu+EnDyK+oW2PZOeCJSzkfhjZcqCyRaFzne6fFn wkQE6uV0+gAww7/Yj1M9P3q7+N6AStlPcdfBw8IdK20rOHtDlaTLIwcpp35Y8Q== 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 D49F515DC3; Sat, 28 May 2022 20:53:21 +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 24SKrLbj099361; Sat, 28 May 2022 20:53:21 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 24SKrL6d099360; Sat, 28 May 2022 20:53:21 GMT (envelope-from git) Date: Sat, 28 May 2022 20:53:21 GMT Message-Id: <202205282053.24SKrL6d099360@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Dmitry Chagin Subject: git: b408788d6b7e - main - linux(4): Improve recvmsg() readability List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: b408788d6b7edf91a6c4b9e2e8d1b34fe5d41525 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653771202; 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=jabhuLllvMk05kCekcg6LKoNqIVz8wEubd+mlJSL3Gc=; b=idJ8QZzsa6TBbmMePln9VJLkQcnU7XT/wh4ORE5Mb8DpVWL3NvtSyuIDZT3w7l7RVGSkGv JaLVgu3O1c/pMly0imDchbmY4+jX0tznpMua/S8jmELDBTUUxT2DQo2/5kuBcNr3NtQZDO 5mQtVRQ7Rpd1bJ6A5OJyj+C9S7VOraCRrJfVecd3tNsPG0fGv/f7dE1v2LbA7CwsMbRRk4 JTZJZ3kAK/f/QQhlkmxaIiQaW+HgIyJ2Wum0cN3Vd8clWNmgSuWjLcJ6n7b79AFXZx/hEa SwV8wvHnjOUQHrH+407m+CAfGK1D1NvryazMGKVmnfh1YCKl/ZbUZJMqa1LUKg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1653771202; a=rsa-sha256; cv=none; b=SB2N55flyAWXb3eTw/Vfcb6HCBm0NIoEXxGTj5B+SPJwpwX8/kJ8K6A5WMhwqhoEB9KRzE aLji7M2FA8EXte5BFT0ZzBi+CICyqD6EfGE/ggNduRhu5UHva26Qg28fLLo60EiMfq5AAm ppqK0TiZNu486+rG4oMQbaOfeoMENr4VoFOcUVJoK/iJ30OYL+Bb1DKtwDQ9XXjVVkzvCA +UK2OdhD9sfwJLdORxjpga/RtazjVWaicFVmUYVUHLNbq/3WFitIlKGwu4RY/yvPTsg9Xg ZoGsriKb2vjgqLUhdgE/u6Lb6KaocwRdplllnrqKcwsj+qEK/vSyJZWzhweXQQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=b408788d6b7edf91a6c4b9e2e8d1b34fe5d41525 commit b408788d6b7edf91a6c4b9e2e8d1b34fe5d41525 Author: Dmitry Chagin AuthorDate: 2022-05-28 20:44:02 +0000 Commit: Dmitry Chagin CommitDate: 2022-05-28 20:44:02 +0000 linux(4): Improve recvmsg() readability To improve recvmsg() readability SCM_ handlers moved to a separate functions. MFC after: 2 weeks --- 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; }