git: 5e872c279aec - main - linux(4): Use the copyin_sigset() in the remaining places

From: Dmitry Chagin <dchagin_at_FreeBSD.org>
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) {