From nobody Fri Jun 17 19:39:26 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 F195385C257; Fri, 17 Jun 2022 19:39:27 +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 4LPq9p6Qftz3RGQ; Fri, 17 Jun 2022 19:39:26 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494767; 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=zDlUmc3CrgLuMhiW16EE5wdmIBFY0ffWbyRW7EJafEw=; b=IwXuGMWuaori+kx9974DjkkJh0FvpgeKHZZN+BBPaeEPNkketkLhJtTlLskuUMt8LRY8fE QO3qBgNEhUSAoCGwsiedmuvC62I3k8GQPZciSPYFbyvYF2eUOQcJ9ypP2nnrrwXu3VvrCB N4anT3Zh1rKghN4Bprsldh6ekWWdtBV5NiG1Tisa7FmWDxzHCPDXrj9+rW0NcDWTv8Las0 B3BBF00N3zGEcVaaYBNes8puA9CN1hPSTWhc8mWNHku9+jngEHhbFoSZFRBGj8dhjQh7nI yJ4e/QGlrkTfaOEu9WTIfZe+e10W/6K32sLTMoNweNuijH4iH3y4EkFVIhtWTQ== 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 8532425C55; Fri, 17 Jun 2022 19:39:26 +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 25HJdQ0h016009; Fri, 17 Jun 2022 19:39:26 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25HJdQqW016008; Fri, 17 Jun 2022 19:39:26 GMT (envelope-from git) Date: Fri, 17 Jun 2022 19:39:26 GMT Message-Id: <202206171939.25HJdQqW016008@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: 92870cb499e3 - stable/13 - linux(4): Add copyin_sigset() helper. 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: 92870cb499e3672f26fcf1ee16111b130b74c188 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494767; 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=zDlUmc3CrgLuMhiW16EE5wdmIBFY0ffWbyRW7EJafEw=; b=hsvskdC5+D9m2XETsDAIzw89uz3Q3jB7uRrui5/6AAS2Su8YEp7OhWzu5yGue+Ck9YRbMJ aUvQjC925gB1mhlIh9kfVcNHkxQPwYnMN8dANVhkLNnOK5LUxhO9QdnV2qo2PchjQH/iNc P0LlWKZvxrRR+zXHKIRhav31jx+g35m2DwrIYL/PTEq83JOZ1OyC3RQ3KV4F1Wd+Kscozq zVKdj/ri2dTm2L8dfSlfZmtnTXW8LQ6NuiwIqQdrrvXwWQ7uF+vj02alH7HE2NszMKsHFP qydG9ggb65Jf19/GBouMjRLoM23zRLhqjm68+gqom5MeihdfPwyawESp+Su0Mw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1655494767; a=rsa-sha256; cv=none; b=w1Bh+u+n5Ip2r9yZomigYZK5xbq1EtSM/nOSKDm3mmrpUCLLn7mxjIe1yU83vrc7d2fHij zhcXwXQPthLkof1eUaNk4kOMgehDAHUFwaterC2q+5ja5qLFZw1saUN/9S+R7/ghi+FU/a ClGXAHRb6ZYrNxOC4y6GC99XVkwsDYAr+vEulJYo9ujw1ype9L8ACfHEr/6bMnZGemEtvM +v8IipMSPYKBvG1MZFuDvyeni/SeOWHnKW8O5DscS2E5ppiT3PPEvk5qqfMy+Mo6aafpkh vGJZbq2qpenOdcMSL2R02mvUgRGqdyBrYiBjFZQWGXOgMyw/gv+RkZVveZxF2A== 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=92870cb499e3672f26fcf1ee16111b130b74c188 commit 92870cb499e3672f26fcf1ee16111b130b74c188 Author: Dmitry Chagin AuthorDate: 2022-04-26 16:35:57 +0000 Commit: Dmitry Chagin CommitDate: 2022-06-17 19:34:04 +0000 linux(4): Add copyin_sigset() helper. MFC after: 2 weeks (cherry picked from commit 3923e632094a7e4cc66cd8e68964b9cb495119e2) --- sys/compat/linux/linux_event.c | 17 ++++++----------- sys/compat/linux/linux_signal.c | 37 +++++++++++++++++++++++++------------ sys/compat/linux/linux_signal.h | 1 + 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/sys/compat/linux/linux_event.c b/sys/compat/linux/linux_event.c index 661e68ce4289..c96159dcdfe3 100644 --- a/sys/compat/linux/linux_event.c +++ b/sys/compat/linux/linux_event.c @@ -67,6 +67,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -523,19 +524,13 @@ int linux_epoll_pwait(struct thread *td, struct linux_epoll_pwait_args *args) { sigset_t mask, *pmask; - l_sigset_t lmask; int error; - if (args->mask != NULL) { - if (args->sigsetsize != sizeof(l_sigset_t)) - return (EINVAL); - error = copyin(args->mask, &lmask, sizeof(l_sigset_t)); - if (error != 0) - return (error); - linux_to_bsd_sigset(&lmask, &mask); - pmask = &mask; - } else - pmask = NULL; + error = linux_copyin_sigset(args->mask, sizeof(l_sigset_t), + &mask, &pmask); + if (error != 0) + return (error); + return (linux_epoll_wait_common(td, args->epfd, args->events, args->maxevents, args->timeout, pmask)); } diff --git a/sys/compat/linux/linux_signal.c b/sys/compat/linux/linux_signal.c index c506edae0fc9..0848040d009c 100644 --- a/sys/compat/linux/linux_signal.c +++ b/sys/compat/linux/linux_signal.c @@ -458,17 +458,13 @@ linux_common_rt_sigtimedwait(struct thread *td, l_sigset_t *mask, struct timespec *tsa, l_siginfo_t *ptr, l_size_t sigsetsize) { int error, sig; - l_sigset_t lset; sigset_t bset; l_siginfo_t lsi; ksiginfo_t ksi; - if (sigsetsize != sizeof(l_sigset_t)) - return (EINVAL); - - if ((error = copyin(mask, &lset, sizeof(lset)))) + error = linux_copyin_sigset(mask, sigsetsize, &bset, NULL); + if (error != 0) return (error); - linux_to_bsd_sigset(&lset, &bset); ksiginfo_init(&ksi); error = kern_sigtimedwait(td, bset, &ksi, tsa); @@ -772,18 +768,14 @@ linux_rt_tgsigqueueinfo(struct thread *td, struct linux_rt_tgsigqueueinfo_args * int linux_rt_sigsuspend(struct thread *td, struct linux_rt_sigsuspend_args *uap) { - l_sigset_t lmask; sigset_t sigmask; int error; - if (uap->sigsetsize != sizeof(l_sigset_t)) - return (EINVAL); - - error = copyin(uap->newset, &lmask, sizeof(l_sigset_t)); + error = linux_copyin_sigset(uap->newset, uap->sigsetsize, + &sigmask, NULL); if (error != 0) return (error); - linux_to_bsd_sigset(&lmask, &sigmask); return (kern_sigsuspend(td, sigmask)); } @@ -867,3 +859,24 @@ linux_psignal(struct thread *td, int pid, int sig) ksi.ksi_uid = td->td_proc->p_ucred->cr_ruid; return (linux_pksignal(td, pid, sig, &ksi)); } + +int +linux_copyin_sigset(l_sigset_t *lset, l_size_t sigsetsize, sigset_t *set, + sigset_t **pset) +{ + l_sigset_t lmask; + int error; + + if (sigsetsize != sizeof(l_sigset_t)) + return (EINVAL); + if (lset != NULL) { + error = copyin(lset, &lmask, sizeof(l_sigset_t)); + if (error != 0) + return (error); + linux_to_bsd_sigset(&lmask, set); + if (pset != NULL) + *pset = set; + } else if (pset != NULL) + *pset = NULL; + return (0); +} diff --git a/sys/compat/linux/linux_signal.h b/sys/compat/linux/linux_signal.h index f434ab1b1b35..8d6022fc3cc7 100644 --- a/sys/compat/linux/linux_signal.h +++ b/sys/compat/linux/linux_signal.h @@ -47,5 +47,6 @@ int linux_do_sigaction(struct thread *, int, l_sigaction_t *, l_sigaction_t *); void siginfo_to_lsiginfo(const siginfo_t *si, l_siginfo_t *lsi, l_int sig); int lsiginfo_to_siginfo(struct thread *td, const l_siginfo_t *lsi, siginfo_t *si, int sig); +int linux_copyin_sigset(l_sigset_t *, l_size_t, sigset_t *, sigset_t **); #endif /* _LINUX_SIGNAL_H_ */