From: ebiederm@xmission.com (Eric W. Biederman)
To: Oleg Nesterov <oleg@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Deepa Dinamani <deepa.kernel@gmail.com>,
linux-kernel@vger.kernel.org, arnd@arndb.de, dbueso@suse.de,
axboe@kernel.dk, dave@stgolabs.net, e@80x24.org,
jbaron@akamai.com, linux-fsdevel@vger.kernel.org,
linux-aio@kvack.org, omar.kilani@gmail.com, tglx@linutronix.de,
Al Viro <viro@ZenIV.linux.org.uk>,
Linus Torvalds <torvalds@linux-foundation.org>,
David Laight <David.Laight@ACULAB.COM>,
linux-arch@vger.kernel.org
Subject: [RFC PATCH 1/5] signal: Teach sigsuspend to use set_user_sigmask
Date: Fri, 07 Jun 2019 16:41:23 -0500 [thread overview]
Message-ID: <87ef45axa4.fsf_-_@xmission.com> (raw)
In-Reply-To: <87k1dxaxcl.fsf_-_@xmission.com> (Eric W. Biederman's message of "Fri, 07 Jun 2019 16:39:54 -0500")
The sigsuspend system call overrides the signal mask just
like all of the other users of set_user_sigmask, so convert
it to use the same helpers.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
---
kernel/signal.c | 43 +++++++++++++++++++------------------------
1 file changed, 19 insertions(+), 24 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 6f72cff043f0..bfa36320a4f7 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2932,6 +2932,15 @@ int sigprocmask(int how, sigset_t *set, sigset_t *oldset)
}
EXPORT_SYMBOL(sigprocmask);
+static int set_sigmask(sigset_t *kmask)
+{
+ set_restore_sigmask();
+ current->saved_sigmask = current->blocked;
+ set_current_blocked(kmask);
+
+ return 0;
+}
+
/*
* The api helps set app-provided sigmasks.
*
@@ -2952,11 +2961,7 @@ int set_user_sigmask(const sigset_t __user *umask, size_t sigsetsize)
if (copy_from_user(&kmask, umask, sizeof(sigset_t)))
return -EFAULT;
- set_restore_sigmask();
- current->saved_sigmask = current->blocked;
- set_current_blocked(&kmask);
-
- return 0;
+ return set_sigmask(&kmask);
}
#ifdef CONFIG_COMPAT
@@ -2972,11 +2977,7 @@ int set_compat_user_sigmask(const compat_sigset_t __user *umask,
if (get_compat_sigset(&kmask, umask))
return -EFAULT;
- set_restore_sigmask();
- current->saved_sigmask = current->blocked;
- set_current_blocked(&kmask);
-
- return 0;
+ return set_sigmask(&kmask);
}
#endif
@@ -4409,14 +4410,10 @@ SYSCALL_DEFINE0(pause)
static int sigsuspend(sigset_t *set)
{
- current->saved_sigmask = current->blocked;
- set_current_blocked(set);
-
while (!signal_pending(current)) {
__set_current_state(TASK_INTERRUPTIBLE);
schedule();
}
- set_restore_sigmask();
return -ERESTARTNOHAND;
}
@@ -4430,12 +4427,10 @@ SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize)
{
sigset_t newset;
- /* XXX: Don't preclude handling different sized sigset_t's. */
- if (sigsetsize != sizeof(sigset_t))
- return -EINVAL;
-
- if (copy_from_user(&newset, unewset, sizeof(newset)))
+ set_user_sigmask(unewset, sigsetsize);
+ if (!unewset)
return -EFAULT;
+
return sigsuspend(&newset);
}
@@ -4444,12 +4439,10 @@ COMPAT_SYSCALL_DEFINE2(rt_sigsuspend, compat_sigset_t __user *, unewset, compat_
{
sigset_t newset;
- /* XXX: Don't preclude handling different sized sigset_t's. */
- if (sigsetsize != sizeof(sigset_t))
- return -EINVAL;
-
- if (get_compat_sigset(&newset, unewset))
+ set_compat_user_sigmask(unewset, sigsetsize);
+ if (!unewset)
return -EFAULT;
+
return sigsuspend(&newset);
}
#endif
@@ -4459,6 +4452,7 @@ SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
+ set_sigmask(&blocked);
return sigsuspend(&blocked);
}
#endif
@@ -4467,6 +4461,7 @@ SYSCALL_DEFINE3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
+ set_sigmask(&blocked);
return sigsuspend(&blocked);
}
#endif
--
2.21.0.dirty
--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org. For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
WARNING: multiple messages have this Message-ID (diff)
From: ebiederm@xmission.com (Eric W. Biederman)
To: Oleg Nesterov <oleg@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Deepa Dinamani <deepa.kernel@gmail.com>,
linux-kernel@vger.kernel.org, arnd@arndb.de, dbueso@suse.de,
axboe@kernel.dk, dave@stgolabs.net, e@80x24.org,
jbaron@akamai.com, linux-fsdevel@vger.kernel.org,
linux-aio@kvack.org, omar.kilani@gmail.com, tglx@linutronix.de,
Al Viro <viro@ZenIV.linux.org.uk>,
Linus Torvalds <torvalds@linux-foundation.org>,
David Laight <David.Laight@ACULAB.COM>,
linux-arch@vger.kernel.org
Subject: [RFC PATCH 1/5] signal: Teach sigsuspend to use set_user_sigmask
Date: Fri, 07 Jun 2019 16:41:23 -0500 [thread overview]
Message-ID: <87ef45axa4.fsf_-_@xmission.com> (raw)
Message-ID: <20190607214123.g3oHLz3cr0ZGZC6ptpngdxoCnIaHhTGLNjAngcQeVWc@z> (raw)
In-Reply-To: <87k1dxaxcl.fsf_-_@xmission.com> (Eric W. Biederman's message of "Fri, 07 Jun 2019 16:39:54 -0500")
The sigsuspend system call overrides the signal mask just
like all of the other users of set_user_sigmask, so convert
it to use the same helpers.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
---
kernel/signal.c | 43 +++++++++++++++++++------------------------
1 file changed, 19 insertions(+), 24 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 6f72cff043f0..bfa36320a4f7 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2932,6 +2932,15 @@ int sigprocmask(int how, sigset_t *set, sigset_t *oldset)
}
EXPORT_SYMBOL(sigprocmask);
+static int set_sigmask(sigset_t *kmask)
+{
+ set_restore_sigmask();
+ current->saved_sigmask = current->blocked;
+ set_current_blocked(kmask);
+
+ return 0;
+}
+
/*
* The api helps set app-provided sigmasks.
*
@@ -2952,11 +2961,7 @@ int set_user_sigmask(const sigset_t __user *umask, size_t sigsetsize)
if (copy_from_user(&kmask, umask, sizeof(sigset_t)))
return -EFAULT;
- set_restore_sigmask();
- current->saved_sigmask = current->blocked;
- set_current_blocked(&kmask);
-
- return 0;
+ return set_sigmask(&kmask);
}
#ifdef CONFIG_COMPAT
@@ -2972,11 +2977,7 @@ int set_compat_user_sigmask(const compat_sigset_t __user *umask,
if (get_compat_sigset(&kmask, umask))
return -EFAULT;
- set_restore_sigmask();
- current->saved_sigmask = current->blocked;
- set_current_blocked(&kmask);
-
- return 0;
+ return set_sigmask(&kmask);
}
#endif
@@ -4409,14 +4410,10 @@ SYSCALL_DEFINE0(pause)
static int sigsuspend(sigset_t *set)
{
- current->saved_sigmask = current->blocked;
- set_current_blocked(set);
-
while (!signal_pending(current)) {
__set_current_state(TASK_INTERRUPTIBLE);
schedule();
}
- set_restore_sigmask();
return -ERESTARTNOHAND;
}
@@ -4430,12 +4427,10 @@ SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize)
{
sigset_t newset;
- /* XXX: Don't preclude handling different sized sigset_t's. */
- if (sigsetsize != sizeof(sigset_t))
- return -EINVAL;
-
- if (copy_from_user(&newset, unewset, sizeof(newset)))
+ set_user_sigmask(unewset, sigsetsize);
+ if (!unewset)
return -EFAULT;
+
return sigsuspend(&newset);
}
@@ -4444,12 +4439,10 @@ COMPAT_SYSCALL_DEFINE2(rt_sigsuspend, compat_sigset_t __user *, unewset, compat_
{
sigset_t newset;
- /* XXX: Don't preclude handling different sized sigset_t's. */
- if (sigsetsize != sizeof(sigset_t))
- return -EINVAL;
-
- if (get_compat_sigset(&newset, unewset))
+ set_compat_user_sigmask(unewset, sigsetsize);
+ if (!unewset)
return -EFAULT;
+
return sigsuspend(&newset);
}
#endif
@@ -4459,6 +4452,7 @@ SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
+ set_sigmask(&blocked);
return sigsuspend(&blocked);
}
#endif
@@ -4467,6 +4461,7 @@ SYSCALL_DEFINE3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask)
{
sigset_t blocked;
siginitset(&blocked, mask);
+ set_sigmask(&blocked);
return sigsuspend(&blocked);
}
#endif
--
2.21.0.dirty
next prev parent reply other threads:[~2019-06-07 21:41 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20190522032144.10995-1-deepa.kernel@gmail.com>
[not found] ` <20190529161157.GA27659@redhat.com>
[not found] ` <20190604134117.GA29963@redhat.com>
[not found] ` <20190606140814.GA13440@redhat.com>
2019-06-07 21:39 ` [RFC PATCH 0/5]: Removing saved_sigmask Eric W. Biederman
2019-06-07 21:39 ` Eric W. Biederman
2019-06-07 21:41 ` Eric W. Biederman [this message]
2019-06-07 21:41 ` [RFC PATCH 1/5] signal: Teach sigsuspend to use set_user_sigmask Eric W. Biederman
2019-06-07 22:07 ` Linus Torvalds
2019-06-07 22:07 ` Linus Torvalds
2019-06-10 16:22 ` Oleg Nesterov
2019-06-10 16:22 ` Oleg Nesterov
2019-06-10 21:20 ` Eric W. Biederman
2019-06-10 21:20 ` Eric W. Biederman
2019-06-11 9:52 ` David Laight
2019-06-11 9:52 ` David Laight
2019-06-11 11:14 ` David Laight
2019-06-11 11:14 ` David Laight
2019-06-12 12:55 ` Eric W. Biederman
2019-06-12 12:55 ` Eric W. Biederman
2019-06-12 13:24 ` David Laight
2019-06-12 13:24 ` David Laight
2019-06-12 13:35 ` Oleg Nesterov
2019-06-12 13:35 ` Oleg Nesterov
2019-06-12 13:39 ` David Laight
2019-06-12 13:39 ` David Laight
2019-06-11 15:46 ` David Laight
2019-06-11 15:46 ` David Laight
2019-06-12 12:40 ` Eric W. Biederman
2019-06-12 12:40 ` Eric W. Biederman
2019-06-12 13:45 ` Oleg Nesterov
2019-06-12 13:45 ` Oleg Nesterov
2019-06-12 14:18 ` David Laight
2019-06-12 14:18 ` David Laight
2019-06-12 15:11 ` Eric W. Biederman
2019-06-12 15:11 ` Eric W. Biederman
2019-06-12 15:37 ` Oleg Nesterov
2019-06-12 15:37 ` Oleg Nesterov
2019-06-13 8:48 ` David Laight
2019-06-13 8:48 ` David Laight
2019-06-13 9:43 ` Oleg Nesterov
2019-06-13 9:43 ` Oleg Nesterov
2019-06-13 10:56 ` David Laight
2019-06-13 10:56 ` David Laight
2019-06-13 12:43 ` Oleg Nesterov
2019-06-13 12:43 ` Oleg Nesterov
2019-06-11 18:55 ` Oleg Nesterov
2019-06-11 18:55 ` Oleg Nesterov
2019-06-11 19:02 ` Eric W. Biederman
2019-06-11 19:02 ` Eric W. Biederman
2019-06-12 8:39 ` David Laight
2019-06-12 8:39 ` David Laight
2019-06-12 13:09 ` Eric W. Biederman
2019-06-12 13:09 ` Eric W. Biederman
2019-06-07 21:41 ` [RFC PATCH 2/5] signal/kvm: Stop using sigprocmask in kvm_sigset_(activate|deactivate) Eric W. Biederman
2019-06-07 21:41 ` Eric W. Biederman
2019-06-07 21:42 ` [RFC PATCH 3/5] signal: Always keep real_blocked in sync with blocked Eric W. Biederman
2019-06-07 21:42 ` Eric W. Biederman
2019-06-07 21:43 ` [RFC PATCH 4/5] signal: Remove saved_sigmask Eric W. Biederman
2019-06-07 21:43 ` Eric W. Biederman
2019-06-07 21:44 ` [RFC PATCH 5/5] signal: Remove the unnecessary restore_sigmask flag Eric W. Biederman
2019-06-07 21:44 ` Eric W. Biederman
2019-06-11 18:58 ` [RFC PATCH 0/5]: Removing saved_sigmask Oleg Nesterov
2019-06-11 18:58 ` Oleg Nesterov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ef45axa4.fsf_-_@xmission.com \
--to=ebiederm@xmission.com \
--cc=David.Laight@ACULAB.COM \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=axboe@kernel.dk \
--cc=dave@stgolabs.net \
--cc=dbueso@suse.de \
--cc=deepa.kernel@gmail.com \
--cc=e@80x24.org \
--cc=jbaron@akamai.com \
--cc=linux-aio@kvack.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=omar.kilani@gmail.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=viro@ZenIV.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).