Messages in this thread | | | Subject | Re: [PATCH 1/2] sigaltstack: implement SS_AUTODISARM flag | From | Stas Sergeev <> | Date | Mon, 29 Feb 2016 09:29:26 +0300 |
| |
29.02.2016 00:13, Stas Sergeev пишет: > This patch implements the SS_AUTODISARM flag that can be ORed with > SS_ONSTACK when forming ss_flags. > When this flag is set, sigaltstack will be disabled when entering > the signal handler; more precisely, after saving sas to uc_stack. > When leaving the signal handler, the sigaltstack is restored by > uc_stack. > When this flag is used, it is safe to switch from sighandler with > swapcontext(). Without this flag, the subsequent signal will corrupt > the state of the switched-away sighandler. > > CC: Ingo Molnar <mingo@redhat.com> > CC: Peter Zijlstra <peterz@infradead.org> > CC: Richard Weinberger <richard@nod.at> > CC: Andrew Morton <akpm@linux-foundation.org> > CC: Oleg Nesterov <oleg@redhat.com> > CC: Tejun Heo <tj@kernel.org> > CC: Heinrich Schuchardt <xypron.glpk@gmx.de> > CC: Jason Low <jason.low2@hp.com> > CC: Andrea Arcangeli <aarcange@redhat.com> > CC: Frederic Weisbecker <fweisbec@gmail.com> > CC: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> > CC: Josh Triplett <josh@joshtriplett.org> > CC: "Eric W. Biederman" <ebiederm@xmission.com> > CC: Aleksa Sarai <cyphar@cyphar.com> > CC: "Amanieu d'Antras" <amanieu@gmail.com> > CC: Paul Moore <pmoore@redhat.com> > CC: Sasha Levin <sasha.levin@oracle.com> > CC: Palmer Dabbelt <palmer@dabbelt.com> > CC: Vladimir Davydov <vdavydov@parallels.com> > CC: linux-kernel@vger.kernel.org > CC: linux-api@vger.kernel.org > CC: Andy Lutomirski <luto@amacapital.net> > > Signed-off-by: Stas Sergeev <stsp@users.sourceforge.net> > --- > include/linux/sched.h | 1 + > include/linux/signal.h | 4 +++- > include/uapi/linux/signal.h | 3 +++ > kernel/fork.c | 4 +++- > kernel/signal.c | 23 ++++++++++++----------- > 5 files changed, 22 insertions(+), 13 deletions(-) > > diff --git a/include/linux/sched.h b/include/linux/sched.h > index a10494a..f561d34 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -1587,6 +1587,7 @@ struct task_struct { > > unsigned long sas_ss_sp; > size_t sas_ss_size; > + unsigned sas_ss_flags; > > struct callback_head *task_works; > > diff --git a/include/linux/signal.h b/include/linux/signal.h > index 92557bb..be3ebe0 100644 > --- a/include/linux/signal.h > +++ b/include/linux/signal.h > @@ -432,8 +432,10 @@ int __save_altstack(stack_t __user *, unsigned long); > stack_t __user *__uss = uss; \ > struct task_struct *t = current; \ > put_user_ex((void __user *)t->sas_ss_sp, &__uss->ss_sp); \ > - put_user_ex(sas_ss_flags(sp), &__uss->ss_flags); \ > + put_user_ex(t->sas_ss_flags, &__uss->ss_flags); \ > put_user_ex(t->sas_ss_size, &__uss->ss_size); \ > + if (t->sas_ss_flags & SS_AUTODISARM) \ > + t->sas_ss_size = 0; \ Should also reset flags here... Will send v4.
| |