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, stable@vger.kernel.org, Al Viro <viro@ZenIV.linux.org.uk>, Linus Torvalds <torvalds@linux-foundation.org>, David Laight <David.Laight@ACULAB.COM>, <linux-api@vger.kernel.org>, Michael Kerrisk <mtk.manpages@gmail.com> Subject: Re: [PATCH] signal: remove the wrong signal_pending() check in restore_user_sigmask() Date: Tue, 04 Jun 2019 10:31:41 -0500 [thread overview] Message-ID: <87tvd5nz8i.fsf@xmission.com> (raw) In-Reply-To: <20190604134117.GA29963@redhat.com> (Oleg Nesterov's message of "Tue, 4 Jun 2019 15:41:17 +0200") Oleg Nesterov <oleg@redhat.com> writes: > This is the minimal fix for stable, I'll send cleanups later. > > The commit 854a6ed56839a40f6b5d02a2962f48841482eec4 ("signal: Add > restore_user_sigmask()") introduced the visible change which breaks > user-space: a signal temporary unblocked by set_user_sigmask() can > be delivered even if the caller returns success or timeout. > > Change restore_user_sigmask() to accept the additional "interrupted" > argument which should be used instead of signal_pending() check, and > update the callers. > > Reported-by: Eric Wong <e@80x24.org> > Fixes: 854a6ed56839a40f6b5d02a2962f48841482eec4 ("signal: Add restore_user_sigmask()") > cc: stable@vger.kernel.org (v5.0+) > Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: "Eric W. Biederman" <ebiederm@xmission.com> I have read through the patch and it looks good. For clarity. I don't think this is required by posix, or fundamentally to remove the races in select. It is what linux has always done and we have applications who care so I agree this fix is needed. Further in any case where the semantic change that this patch rolls back (aka where allowing a signal to be delivered and the select like call to complete) would be advantage we can do as well if not better by using signalfd. Michael is there any chance we can get this guarantee of the linux implementation of pselect and friends clearly documented. The guarantee that if the system call completes successfully we are guaranteed that no signal that is unblocked by using sigmask will be delivered? Eric > --- > fs/aio.c | 28 ++++++++++++++++++++-------- > fs/eventpoll.c | 4 ++-- > fs/io_uring.c | 7 ++++--- > fs/select.c | 18 ++++++------------ > include/linux/signal.h | 2 +- > kernel/signal.c | 5 +++-- > 6 files changed, 36 insertions(+), 28 deletions(-) > > diff --git a/fs/aio.c b/fs/aio.c > index 3490d1f..c1e581d 100644 > --- a/fs/aio.c > +++ b/fs/aio.c > @@ -2095,6 +2095,7 @@ SYSCALL_DEFINE6(io_pgetevents, > struct __aio_sigset ksig = { NULL, }; > sigset_t ksigmask, sigsaved; > struct timespec64 ts; > + bool interrupted; > int ret; > > if (timeout && unlikely(get_timespec64(&ts, timeout))) > @@ -2108,8 +2109,10 @@ SYSCALL_DEFINE6(io_pgetevents, > return ret; > > ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &ts : NULL); > - restore_user_sigmask(ksig.sigmask, &sigsaved); > - if (signal_pending(current) && !ret) > + > + interrupted = signal_pending(current); > + restore_user_sigmask(ksig.sigmask, &sigsaved, interrupted); > + if (interrupted && !ret) > ret = -ERESTARTNOHAND; > > return ret; > @@ -2128,6 +2131,7 @@ SYSCALL_DEFINE6(io_pgetevents_time32, > struct __aio_sigset ksig = { NULL, }; > sigset_t ksigmask, sigsaved; > struct timespec64 ts; > + bool interrupted; > int ret; > > if (timeout && unlikely(get_old_timespec32(&ts, timeout))) > @@ -2142,8 +2146,10 @@ SYSCALL_DEFINE6(io_pgetevents_time32, > return ret; > > ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &ts : NULL); > - restore_user_sigmask(ksig.sigmask, &sigsaved); > - if (signal_pending(current) && !ret) > + > + interrupted = signal_pending(current); > + restore_user_sigmask(ksig.sigmask, &sigsaved, interrupted); > + if (interrupted && !ret) > ret = -ERESTARTNOHAND; > > return ret; > @@ -2193,6 +2199,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents, > struct __compat_aio_sigset ksig = { NULL, }; > sigset_t ksigmask, sigsaved; > struct timespec64 t; > + bool interrupted; > int ret; > > if (timeout && get_old_timespec32(&t, timeout)) > @@ -2206,8 +2213,10 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents, > return ret; > > ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL); > - restore_user_sigmask(ksig.sigmask, &sigsaved); > - if (signal_pending(current) && !ret) > + > + interrupted = signal_pending(current); > + restore_user_sigmask(ksig.sigmask, &sigsaved, interrupted); > + if (interrupted && !ret) > ret = -ERESTARTNOHAND; > > return ret; > @@ -2226,6 +2235,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents_time64, > struct __compat_aio_sigset ksig = { NULL, }; > sigset_t ksigmask, sigsaved; > struct timespec64 t; > + bool interrupted; > int ret; > > if (timeout && get_timespec64(&t, timeout)) > @@ -2239,8 +2249,10 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents_time64, > return ret; > > ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL); > - restore_user_sigmask(ksig.sigmask, &sigsaved); > - if (signal_pending(current) && !ret) > + > + interrupted = signal_pending(current); > + restore_user_sigmask(ksig.sigmask, &sigsaved, interrupted); > + if (interrupted && !ret) > ret = -ERESTARTNOHAND; > > return ret; > diff --git a/fs/eventpoll.c b/fs/eventpoll.c > index c6f5131..4c74c76 100644 > --- a/fs/eventpoll.c > +++ b/fs/eventpoll.c > @@ -2325,7 +2325,7 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events, > > error = do_epoll_wait(epfd, events, maxevents, timeout); > > - restore_user_sigmask(sigmask, &sigsaved); > + restore_user_sigmask(sigmask, &sigsaved, error == -EINTR); > > return error; > } > @@ -2350,7 +2350,7 @@ COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd, > > err = do_epoll_wait(epfd, events, maxevents, timeout); > > - restore_user_sigmask(sigmask, &sigsaved); > + restore_user_sigmask(sigmask, &sigsaved, err == -EINTR); > > return err; > } > diff --git a/fs/io_uring.c b/fs/io_uring.c > index 0fbb486..1147c5d 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -2201,11 +2201,12 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, > } > > ret = wait_event_interruptible(ctx->wait, io_cqring_events(ring) >= min_events); > - if (ret == -ERESTARTSYS) > - ret = -EINTR; > > if (sig) > - restore_user_sigmask(sig, &sigsaved); > + restore_user_sigmask(sig, &sigsaved, ret == -ERESTARTSYS); > + > + if (ret == -ERESTARTSYS) > + ret = -EINTR; > > return READ_ONCE(ring->r.head) == READ_ONCE(ring->r.tail) ? ret : 0; > } > diff --git a/fs/select.c b/fs/select.c > index 6cbc9ff..a4d8f6e 100644 > --- a/fs/select.c > +++ b/fs/select.c > @@ -758,10 +758,9 @@ static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp, > return ret; > > ret = core_sys_select(n, inp, outp, exp, to); > + restore_user_sigmask(sigmask, &sigsaved, ret == -ERESTARTNOHAND); > ret = poll_select_copy_remaining(&end_time, tsp, type, ret); > > - restore_user_sigmask(sigmask, &sigsaved); > - > return ret; > } > > @@ -1106,8 +1105,7 @@ SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds, > > ret = do_sys_poll(ufds, nfds, to); > > - restore_user_sigmask(sigmask, &sigsaved); > - > + restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR); > /* We can restart this syscall, usually */ > if (ret == -EINTR) > ret = -ERESTARTNOHAND; > @@ -1142,8 +1140,7 @@ SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds, unsigned int, nfds, > > ret = do_sys_poll(ufds, nfds, to); > > - restore_user_sigmask(sigmask, &sigsaved); > - > + restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR); > /* We can restart this syscall, usually */ > if (ret == -EINTR) > ret = -ERESTARTNOHAND; > @@ -1350,10 +1347,9 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp, > return ret; > > ret = compat_core_sys_select(n, inp, outp, exp, to); > + restore_user_sigmask(sigmask, &sigsaved, ret == -ERESTARTNOHAND); > ret = poll_select_copy_remaining(&end_time, tsp, type, ret); > > - restore_user_sigmask(sigmask, &sigsaved); > - > return ret; > } > > @@ -1425,8 +1421,7 @@ COMPAT_SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds, > > ret = do_sys_poll(ufds, nfds, to); > > - restore_user_sigmask(sigmask, &sigsaved); > - > + restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR); > /* We can restart this syscall, usually */ > if (ret == -EINTR) > ret = -ERESTARTNOHAND; > @@ -1461,8 +1456,7 @@ COMPAT_SYSCALL_DEFINE5(ppoll_time64, struct pollfd __user *, ufds, > > ret = do_sys_poll(ufds, nfds, to); > > - restore_user_sigmask(sigmask, &sigsaved); > - > + restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR); > /* We can restart this syscall, usually */ > if (ret == -EINTR) > ret = -ERESTARTNOHAND; > diff --git a/include/linux/signal.h b/include/linux/signal.h > index 9702016..78c2bb3 100644 > --- a/include/linux/signal.h > +++ b/include/linux/signal.h > @@ -276,7 +276,7 @@ extern int sigprocmask(int, sigset_t *, sigset_t *); > extern int set_user_sigmask(const sigset_t __user *usigmask, sigset_t *set, > sigset_t *oldset, size_t sigsetsize); > extern void restore_user_sigmask(const void __user *usigmask, > - sigset_t *sigsaved); > + sigset_t *sigsaved, bool interrupted); > extern void set_current_blocked(sigset_t *); > extern void __set_current_blocked(const sigset_t *); > extern int show_unhandled_signals; > diff --git a/kernel/signal.c b/kernel/signal.c > index 328a01e..aa6a6f1 100644 > --- a/kernel/signal.c > +++ b/kernel/signal.c > @@ -2912,7 +2912,8 @@ EXPORT_SYMBOL(set_compat_user_sigmask); > * This is useful for syscalls such as ppoll, pselect, io_pgetevents and > * epoll_pwait where a new sigmask is passed in from userland for the syscalls. > */ > -void restore_user_sigmask(const void __user *usigmask, sigset_t *sigsaved) > +void restore_user_sigmask(const void __user *usigmask, sigset_t *sigsaved, > + bool interrupted) > { > > if (!usigmask) > @@ -2922,7 +2923,7 @@ void restore_user_sigmask(const void __user *usigmask, sigset_t *sigsaved) > * Restoring sigmask here can lead to delivering signals that the above > * syscalls are intended to block because of the sigmask passed in. > */ > - if (signal_pending(current)) { > + if (interrupted) { > current->saved_sigmask = *sigsaved; > set_restore_sigmask(); > return;
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, stable@vger.kernel.org, Al Viro <viro@ZenIV.linux.org.uk>, Linus Torvalds <torvalds@linux-foundation.org>, David Laight <David.Laight@ACULAB.COM>, linux-api@vger.kernel.org, Michael Kerrisk <mtk.manpages@gmail.com> Subject: Re: [PATCH] signal: remove the wrong signal_pending() check in restore_user_sigmask() Date: Tue, 04 Jun 2019 10:31:41 -0500 [thread overview] Message-ID: <87tvd5nz8i.fsf@xmission.com> (raw) In-Reply-To: <20190604134117.GA29963@redhat.com> (Oleg Nesterov's message of "Tue, 4 Jun 2019 15:41:17 +0200") Oleg Nesterov <oleg@redhat.com> writes: > This is the minimal fix for stable, I'll send cleanups later. > > The commit 854a6ed56839a40f6b5d02a2962f48841482eec4 ("signal: Add > restore_user_sigmask()") introduced the visible change which breaks > user-space: a signal temporary unblocked by set_user_sigmask() can > be delivered even if the caller returns success or timeout. > > Change restore_user_sigmask() to accept the additional "interrupted" > argument which should be used instead of signal_pending() check, and > update the callers. > > Reported-by: Eric Wong <e@80x24.org> > Fixes: 854a6ed56839a40f6b5d02a2962f48841482eec4 ("signal: Add restore_user_sigmask()") > cc: stable@vger.kernel.org (v5.0+) > Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: "Eric W. Biederman" <ebiederm@xmission.com> I have read through the patch and it looks good. For clarity. I don't think this is required by posix, or fundamentally to remove the races in select. It is what linux has always done and we have applications who care so I agree this fix is needed. Further in any case where the semantic change that this patch rolls back (aka where allowing a signal to be delivered and the select like call to complete) would be advantage we can do as well if not better by using signalfd. Michael is there any chance we can get this guarantee of the linux implementation of pselect and friends clearly documented. The guarantee that if the system call completes successfully we are guaranteed that no signal that is unblocked by using sigmask will be delivered? Eric > --- > fs/aio.c | 28 ++++++++++++++++++++-------- > fs/eventpoll.c | 4 ++-- > fs/io_uring.c | 7 ++++--- > fs/select.c | 18 ++++++------------ > include/linux/signal.h | 2 +- > kernel/signal.c | 5 +++-- > 6 files changed, 36 insertions(+), 28 deletions(-) > > diff --git a/fs/aio.c b/fs/aio.c > index 3490d1f..c1e581d 100644 > --- a/fs/aio.c > +++ b/fs/aio.c > @@ -2095,6 +2095,7 @@ SYSCALL_DEFINE6(io_pgetevents, > struct __aio_sigset ksig = { NULL, }; > sigset_t ksigmask, sigsaved; > struct timespec64 ts; > + bool interrupted; > int ret; > > if (timeout && unlikely(get_timespec64(&ts, timeout))) > @@ -2108,8 +2109,10 @@ SYSCALL_DEFINE6(io_pgetevents, > return ret; > > ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &ts : NULL); > - restore_user_sigmask(ksig.sigmask, &sigsaved); > - if (signal_pending(current) && !ret) > + > + interrupted = signal_pending(current); > + restore_user_sigmask(ksig.sigmask, &sigsaved, interrupted); > + if (interrupted && !ret) > ret = -ERESTARTNOHAND; > > return ret; > @@ -2128,6 +2131,7 @@ SYSCALL_DEFINE6(io_pgetevents_time32, > struct __aio_sigset ksig = { NULL, }; > sigset_t ksigmask, sigsaved; > struct timespec64 ts; > + bool interrupted; > int ret; > > if (timeout && unlikely(get_old_timespec32(&ts, timeout))) > @@ -2142,8 +2146,10 @@ SYSCALL_DEFINE6(io_pgetevents_time32, > return ret; > > ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &ts : NULL); > - restore_user_sigmask(ksig.sigmask, &sigsaved); > - if (signal_pending(current) && !ret) > + > + interrupted = signal_pending(current); > + restore_user_sigmask(ksig.sigmask, &sigsaved, interrupted); > + if (interrupted && !ret) > ret = -ERESTARTNOHAND; > > return ret; > @@ -2193,6 +2199,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents, > struct __compat_aio_sigset ksig = { NULL, }; > sigset_t ksigmask, sigsaved; > struct timespec64 t; > + bool interrupted; > int ret; > > if (timeout && get_old_timespec32(&t, timeout)) > @@ -2206,8 +2213,10 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents, > return ret; > > ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL); > - restore_user_sigmask(ksig.sigmask, &sigsaved); > - if (signal_pending(current) && !ret) > + > + interrupted = signal_pending(current); > + restore_user_sigmask(ksig.sigmask, &sigsaved, interrupted); > + if (interrupted && !ret) > ret = -ERESTARTNOHAND; > > return ret; > @@ -2226,6 +2235,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents_time64, > struct __compat_aio_sigset ksig = { NULL, }; > sigset_t ksigmask, sigsaved; > struct timespec64 t; > + bool interrupted; > int ret; > > if (timeout && get_timespec64(&t, timeout)) > @@ -2239,8 +2249,10 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents_time64, > return ret; > > ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL); > - restore_user_sigmask(ksig.sigmask, &sigsaved); > - if (signal_pending(current) && !ret) > + > + interrupted = signal_pending(current); > + restore_user_sigmask(ksig.sigmask, &sigsaved, interrupted); > + if (interrupted && !ret) > ret = -ERESTARTNOHAND; > > return ret; > diff --git a/fs/eventpoll.c b/fs/eventpoll.c > index c6f5131..4c74c76 100644 > --- a/fs/eventpoll.c > +++ b/fs/eventpoll.c > @@ -2325,7 +2325,7 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events, > > error = do_epoll_wait(epfd, events, maxevents, timeout); > > - restore_user_sigmask(sigmask, &sigsaved); > + restore_user_sigmask(sigmask, &sigsaved, error == -EINTR); > > return error; > } > @@ -2350,7 +2350,7 @@ COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd, > > err = do_epoll_wait(epfd, events, maxevents, timeout); > > - restore_user_sigmask(sigmask, &sigsaved); > + restore_user_sigmask(sigmask, &sigsaved, err == -EINTR); > > return err; > } > diff --git a/fs/io_uring.c b/fs/io_uring.c > index 0fbb486..1147c5d 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -2201,11 +2201,12 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, > } > > ret = wait_event_interruptible(ctx->wait, io_cqring_events(ring) >= min_events); > - if (ret == -ERESTARTSYS) > - ret = -EINTR; > > if (sig) > - restore_user_sigmask(sig, &sigsaved); > + restore_user_sigmask(sig, &sigsaved, ret == -ERESTARTSYS); > + > + if (ret == -ERESTARTSYS) > + ret = -EINTR; > > return READ_ONCE(ring->r.head) == READ_ONCE(ring->r.tail) ? ret : 0; > } > diff --git a/fs/select.c b/fs/select.c > index 6cbc9ff..a4d8f6e 100644 > --- a/fs/select.c > +++ b/fs/select.c > @@ -758,10 +758,9 @@ static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp, > return ret; > > ret = core_sys_select(n, inp, outp, exp, to); > + restore_user_sigmask(sigmask, &sigsaved, ret == -ERESTARTNOHAND); > ret = poll_select_copy_remaining(&end_time, tsp, type, ret); > > - restore_user_sigmask(sigmask, &sigsaved); > - > return ret; > } > > @@ -1106,8 +1105,7 @@ SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds, > > ret = do_sys_poll(ufds, nfds, to); > > - restore_user_sigmask(sigmask, &sigsaved); > - > + restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR); > /* We can restart this syscall, usually */ > if (ret == -EINTR) > ret = -ERESTARTNOHAND; > @@ -1142,8 +1140,7 @@ SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds, unsigned int, nfds, > > ret = do_sys_poll(ufds, nfds, to); > > - restore_user_sigmask(sigmask, &sigsaved); > - > + restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR); > /* We can restart this syscall, usually */ > if (ret == -EINTR) > ret = -ERESTARTNOHAND; > @@ -1350,10 +1347,9 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp, > return ret; > > ret = compat_core_sys_select(n, inp, outp, exp, to); > + restore_user_sigmask(sigmask, &sigsaved, ret == -ERESTARTNOHAND); > ret = poll_select_copy_remaining(&end_time, tsp, type, ret); > > - restore_user_sigmask(sigmask, &sigsaved); > - > return ret; > } > > @@ -1425,8 +1421,7 @@ COMPAT_SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds, > > ret = do_sys_poll(ufds, nfds, to); > > - restore_user_sigmask(sigmask, &sigsaved); > - > + restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR); > /* We can restart this syscall, usually */ > if (ret == -EINTR) > ret = -ERESTARTNOHAND; > @@ -1461,8 +1456,7 @@ COMPAT_SYSCALL_DEFINE5(ppoll_time64, struct pollfd __user *, ufds, > > ret = do_sys_poll(ufds, nfds, to); > > - restore_user_sigmask(sigmask, &sigsaved); > - > + restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR); > /* We can restart this syscall, usually */ > if (ret == -EINTR) > ret = -ERESTARTNOHAND; > diff --git a/include/linux/signal.h b/include/linux/signal.h > index 9702016..78c2bb3 100644 > --- a/include/linux/signal.h > +++ b/include/linux/signal.h > @@ -276,7 +276,7 @@ extern int sigprocmask(int, sigset_t *, sigset_t *); > extern int set_user_sigmask(const sigset_t __user *usigmask, sigset_t *set, > sigset_t *oldset, size_t sigsetsize); > extern void restore_user_sigmask(const void __user *usigmask, > - sigset_t *sigsaved); > + sigset_t *sigsaved, bool interrupted); > extern void set_current_blocked(sigset_t *); > extern void __set_current_blocked(const sigset_t *); > extern int show_unhandled_signals; > diff --git a/kernel/signal.c b/kernel/signal.c > index 328a01e..aa6a6f1 100644 > --- a/kernel/signal.c > +++ b/kernel/signal.c > @@ -2912,7 +2912,8 @@ EXPORT_SYMBOL(set_compat_user_sigmask); > * This is useful for syscalls such as ppoll, pselect, io_pgetevents and > * epoll_pwait where a new sigmask is passed in from userland for the syscalls. > */ > -void restore_user_sigmask(const void __user *usigmask, sigset_t *sigsaved) > +void restore_user_sigmask(const void __user *usigmask, sigset_t *sigsaved, > + bool interrupted) > { > > if (!usigmask) > @@ -2922,7 +2923,7 @@ void restore_user_sigmask(const void __user *usigmask, sigset_t *sigsaved) > * Restoring sigmask here can lead to delivering signals that the above > * syscalls are intended to block because of the sigmask passed in. > */ > - if (signal_pending(current)) { > + if (interrupted) { > current->saved_sigmask = *sigsaved; > set_restore_sigmask(); > return;
next prev parent reply other threads:[~2019-06-04 15:31 UTC|newest] Thread overview: 155+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-05-22 3:21 [PATCH v2] signal: Adjust error codes according to restore_user_sigmask() Deepa Dinamani 2019-05-22 15:05 ` Oleg Nesterov 2019-05-22 15:55 ` Deepa Dinamani 2019-05-22 16:14 ` Oleg Nesterov 2019-05-22 16:33 ` Deepa Dinamani 2019-05-23 9:03 ` David Laight 2019-05-23 14:59 ` Oleg Nesterov 2019-05-23 16:18 ` David Laight 2019-05-23 16:36 ` Oleg Nesterov 2019-05-23 16:56 ` David Laight 2019-05-23 18:06 ` Deepa Dinamani 2019-05-23 20:41 ` Deepa Dinamani 2019-05-23 21:06 ` Deepa Dinamani 2019-05-24 9:58 ` David Laight 2019-05-24 14:10 ` Oleg Nesterov 2019-05-24 15:16 ` Deepa Dinamani 2019-05-24 16:33 ` Oleg Nesterov 2019-05-24 17:01 ` Deepa Dinamani 2019-05-27 15:04 ` Oleg Nesterov 2019-05-28 20:47 ` Deepa Dinamani 2019-05-29 16:57 ` Oleg Nesterov 2019-05-29 18:42 ` Deepa Dinamani 2019-05-28 9:02 ` David Laight 2019-05-28 9:12 ` David Laight 2019-05-28 11:37 ` Deepa Dinamani 2019-05-28 12:04 ` David Laight 2019-05-24 14:19 ` Oleg Nesterov 2019-05-24 14:29 ` Deepa Dinamani 2019-05-24 14:51 ` Oleg Nesterov 2019-05-24 13:29 ` Oleg Nesterov 2019-05-24 14:59 ` David Laight 2019-05-24 15:09 ` David Laight 2019-05-24 15:46 ` Oleg Nesterov 2019-05-24 15:44 ` Oleg Nesterov 2019-05-24 16:40 ` David Laight 2019-05-23 14:33 ` Oleg Nesterov 2019-05-22 22:18 ` Chris Down 2019-05-22 22:52 ` Deepa Dinamani 2019-05-22 22:52 ` Deepa Dinamani 2019-05-29 16:11 ` pselect/etc semantics (Was: [PATCH v2] signal: Adjust error codes according to restore_user_sigmask()) Oleg Nesterov 2019-05-29 16:54 ` David Laight 2019-05-29 18:50 ` Eric Wong 2019-05-30 9:34 ` David Laight 2019-05-30 13:04 ` pselect/etc semantics Eric W. Biederman 2019-05-29 16:56 ` pselect/etc semantics (Was: [PATCH v2] signal: Adjust error codes according to restore_user_sigmask()) Deepa Dinamani 2019-05-29 18:26 ` Deepa Dinamani 2019-05-29 22:32 ` Arnd Bergmann 2019-05-30 1:54 ` pselect/etc semantics Eric W. Biederman 2019-05-30 18:28 ` Arnd Bergmann 2019-05-30 14:40 ` pselect/etc semantics (Was: [PATCH v2] signal: Adjust error codes according to restore_user_sigmask()) Oleg Nesterov 2019-05-30 18:37 ` Arnd Bergmann 2019-05-30 13:01 ` pselect/etc semantics Eric W. Biederman 2019-05-30 15:18 ` David Laight 2019-05-30 16:13 ` Oleg Nesterov 2019-05-30 15:38 ` Eric W. Biederman 2019-05-30 15:48 ` Deepa Dinamani 2019-05-30 16:59 ` Deepa Dinamani 2019-05-30 16:08 ` Oleg Nesterov 2019-05-30 17:20 ` Eric W. Biederman 2019-05-30 16:22 ` David Laight 2019-05-30 15:57 ` Oleg Nesterov 2019-05-30 21:03 ` Eric Wong 2019-06-04 13:41 ` [PATCH] signal: remove the wrong signal_pending() check in restore_user_sigmask() Oleg Nesterov 2019-06-04 15:31 ` Eric W. Biederman [this message] 2019-06-04 15:31 ` Eric W. Biederman 2019-06-04 15:57 ` David Laight 2019-06-04 15:57 ` David Laight 2019-06-04 16:37 ` Arnd Bergmann 2019-06-04 18:14 ` Deepa Dinamani 2019-06-04 18:35 ` Eric Wong 2019-06-04 21:26 ` Linus Torvalds 2019-06-04 22:24 ` Eric Wong 2019-06-04 23:51 ` Eric W. Biederman 2019-06-05 9:04 ` Oleg Nesterov 2019-06-05 8:56 ` Oleg Nesterov 2019-06-05 9:02 ` David Laight 2019-06-05 9:25 ` Oleg Nesterov 2019-06-05 9:58 ` David Laight 2019-06-05 15:58 ` [PATCH -mm 0/1] signal: simplify set_user_sigmask/restore_user_sigmask Oleg Nesterov 2019-06-05 15:58 ` [PATCH -mm 1/1] " Oleg Nesterov 2019-06-06 0:14 ` kbuild test robot 2019-06-06 1:06 ` kbuild test robot 2019-06-06 7:25 ` Oleg Nesterov 2019-06-06 7:30 ` Sedat Dilek 2019-06-05 17:24 ` [PATCH -mm 0/1] " Linus Torvalds 2019-06-06 9:05 ` David Laight 2019-06-06 11:05 ` Oleg Nesterov 2019-06-06 11:29 ` David Laight 2019-06-06 12:41 ` Oleg Nesterov 2019-06-06 13:23 ` David Laight 2019-06-06 10:22 ` Oleg Nesterov 2019-06-06 11:32 ` [PATCH -mm V2 1/1] " Oleg Nesterov 2019-06-06 14:08 ` [PATCH 0/2] select: simplify the usage of restore_saved_sigmask_unless() Oleg Nesterov 2019-06-06 14:08 ` [PATCH 1/2] select: change do_poll() to return -ERESTARTNOHAND rather than -EINTR Oleg Nesterov 2019-06-07 18:05 ` Linus Torvalds 2019-06-06 14:09 ` [PATCH 2/2] select: shift restore_saved_sigmask_unless() into poll_select_copy_remaining() Oleg Nesterov 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 ` [RFC PATCH 1/5] signal: Teach sigsuspend to use set_user_sigmask Eric W. Biederman 2019-06-07 21:41 ` Eric W. Biederman 2019-06-07 21:41 ` 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 21:20 ` Eric W. Biederman 2019-06-11 9:52 ` 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 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 12:40 ` Eric W. Biederman 2019-06-12 13:45 ` Oleg Nesterov 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 19:02 ` Eric W. Biederman 2019-06-11 19:02 ` Eric W. Biederman 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-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: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: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: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-07 21:44 ` Eric W. Biederman 2019-06-11 18:58 ` [RFC PATCH 0/5]: Removing saved_sigmask 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=87tvd5nz8i.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-api@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mtk.manpages@gmail.com \ --cc=oleg@redhat.com \ --cc=omar.kilani@gmail.com \ --cc=stable@vger.kernel.org \ --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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.