git: 5e872c279aec - main - linux(4): Use the copyin_sigset() in the remaining places
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 30 May 2022 17:04:24 UTC
The branch main has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=5e872c279aecd169df34602669ee9c86ae9e9f18 commit 5e872c279aecd169df34602669ee9c86ae9e9f18 Author: Dmitry Chagin <dchagin@FreeBSD.org> AuthorDate: 2022-05-30 16:59:45 +0000 Commit: Dmitry Chagin <dchagin@FreeBSD.org> CommitDate: 2022-05-30 16:59:45 +0000 linux(4): Use the copyin_sigset() in the remaining places MFC after: 2 weeks --- sys/compat/linux/linux_misc.c | 26 +++++++------------------- sys/compat/linux/linux_signal.c | 36 ++++++++++++++---------------------- 2 files changed, 21 insertions(+), 41 deletions(-) diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index 3321c9cdd98a..a46e16e26199 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -2420,7 +2420,6 @@ linux_common_pselect6(struct thread *td, l_int nfds, l_fd_set *readfds, { struct timeval utv, tv0, tv1, *tvp; struct l_pselect6arg lpse6; - l_sigset_t l_ss; sigset_t *ssp; sigset_t ss; int error; @@ -2430,16 +2429,10 @@ linux_common_pselect6(struct thread *td, l_int nfds, l_fd_set *readfds, error = copyin(sig, &lpse6, sizeof(lpse6)); if (error != 0) return (error); - if (lpse6.ss_len != sizeof(l_ss)) - return (EINVAL); - if (lpse6.ss != 0) { - error = copyin(PTRIN(lpse6.ss), &l_ss, - sizeof(l_ss)); - if (error != 0) - return (error); - linux_to_bsd_sigset(&l_ss, &ss); - ssp = &ss; - } + error = linux_copyin_sigset(PTRIN(lpse6.ss), + lpse6.ss_len, &ss, &ssp); + if (error != 0) + return (error); } else ssp = NULL; @@ -2530,7 +2523,6 @@ linux_common_ppoll(struct thread *td, struct pollfd *fds, uint32_t nfds, struct timespec ts0, ts1; struct pollfd stackfds[32]; struct pollfd *kfds; - l_sigset_t l_ss; sigset_t *ssp; sigset_t ss; int error; @@ -2538,13 +2530,9 @@ linux_common_ppoll(struct thread *td, struct pollfd *fds, uint32_t nfds, if (kern_poll_maxfds(nfds)) return (EINVAL); if (sset != NULL) { - if (ssize != sizeof(l_ss)) - return (EINVAL); - error = copyin(sset, &l_ss, sizeof(l_ss)); - if (error) - return (error); - linux_to_bsd_sigset(&l_ss, &ss); - ssp = &ss; + error = linux_copyin_sigset(sset, ssize, &ss, &ssp); + if (error != 0) + return (error); } else ssp = NULL; if (tsp != NULL) diff --git a/sys/compat/linux/linux_signal.c b/sys/compat/linux/linux_signal.c index 9aecb8497f3b..a5f5d86d8c5d 100644 --- a/sys/compat/linux/linux_signal.c +++ b/sys/compat/linux/linux_signal.c @@ -266,11 +266,10 @@ linux_rt_sigaction(struct thread *td, struct linux_rt_sigaction_args *args) } static int -linux_do_sigprocmask(struct thread *td, int how, l_sigset_t *new, +linux_do_sigprocmask(struct thread *td, int how, sigset_t *new, l_sigset_t *old) { - sigset_t omask, nmask; - sigset_t *nmaskp; + sigset_t omask; int error; td->td_retval[0] = 0; @@ -288,12 +287,7 @@ linux_do_sigprocmask(struct thread *td, int how, l_sigset_t *new, default: return (EINVAL); } - if (new != NULL) { - linux_to_bsd_sigset(new, &nmask); - nmaskp = &nmask; - } else - nmaskp = NULL; - error = kern_sigprocmask(td, how, nmaskp, &omask, 0); + error = kern_sigprocmask(td, how, new, &omask, 0); if (error == 0 && old != NULL) bsd_to_linux_sigset(&omask, old); @@ -305,15 +299,17 @@ int linux_sigprocmask(struct thread *td, struct linux_sigprocmask_args *args) { l_osigset_t mask; - l_sigset_t set, oset; + l_sigset_t lset, oset; + sigset_t set; int error; if (args->mask != NULL) { error = copyin(args->mask, &mask, sizeof(l_osigset_t)); if (error) return (error); - LINUX_SIGEMPTYSET(set); - set.__mask = mask; + LINUX_SIGEMPTYSET(lset); + lset.__mask = mask; + linux_to_bsd_sigset(&lset, &set); } error = linux_do_sigprocmask(td, args->how, @@ -332,20 +328,16 @@ linux_sigprocmask(struct thread *td, struct linux_sigprocmask_args *args) int linux_rt_sigprocmask(struct thread *td, struct linux_rt_sigprocmask_args *args) { - l_sigset_t set, oset; + l_sigset_t oset; + sigset_t set, *pset; int error; - if (args->sigsetsize != sizeof(l_sigset_t)) + error = linux_copyin_sigset(args->mask, args->sigsetsize, + &set, &pset); + if (error != 0) return (EINVAL); - if (args->mask != NULL) { - error = copyin(args->mask, &set, sizeof(l_sigset_t)); - if (error) - return (error); - } - - error = linux_do_sigprocmask(td, args->how, - args->mask ? &set : NULL, + error = linux_do_sigprocmask(td, args->how, pset, args->omask ? &oset : NULL); if (args->omask != NULL && !error) {