From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757257AbcEDHOz (ORCPT ); Wed, 4 May 2016 03:14:55 -0400 Received: from terminus.zytor.com ([198.137.202.10]:37214 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757198AbcEDHOw (ORCPT ); Wed, 4 May 2016 03:14:52 -0400 Date: Wed, 4 May 2016 00:12:40 -0700 From: tip-bot for Andy Lutomirski Message-ID: Cc: brgerst@gmail.com, shuahkh@osg.samsung.com, vdavydov@parallels.com, aarcange@redhat.com, cyphar@cyphar.com, palmer@dabbelt.com, luto@amacapital.net, linux-kernel@vger.kernel.org, peterz@infradead.org, stsp@list.ru, fweisbec@gmail.com, viro@zeniv.linux.org.uk, hpa@zytor.com, sasha.levin@oracle.com, bp@alien8.de, torvalds@linux-foundation.org, tglx@linutronix.de, khlebnikov@yandex-team.ru, mingo@kernel.org, tj@kernel.org, luto@kernel.org, xypron.glpk@gmx.de, amanieu@gmail.com, dvlasenk@redhat.com, akpm@linux-foundation.org, richard@nod.at, xemul@parallels.com, pmoore@redhat.com, josh@joshtriplett.org, oleg@redhat.com, ebiederm@xmission.com, jason.low2@hp.com Reply-To: aarcange@redhat.com, palmer@dabbelt.com, cyphar@cyphar.com, luto@amacapital.net, linux-kernel@vger.kernel.org, brgerst@gmail.com, vdavydov@parallels.com, shuahkh@osg.samsung.com, peterz@infradead.org, stsp@list.ru, fweisbec@gmail.com, khlebnikov@yandex-team.ru, mingo@kernel.org, luto@kernel.org, tj@kernel.org, viro@zeniv.linux.org.uk, sasha.levin@oracle.com, hpa@zytor.com, torvalds@linux-foundation.org, bp@alien8.de, tglx@linutronix.de, pmoore@redhat.com, josh@joshtriplett.org, oleg@redhat.com, jason.low2@hp.com, ebiederm@xmission.com, dvlasenk@redhat.com, amanieu@gmail.com, xypron.glpk@gmx.de, richard@nod.at, akpm@linux-foundation.org, xemul@parallels.com In-Reply-To: References: To: linux-tip-commits@vger.kernel.org Subject: [tip:core/signals] signals/sigaltstack: If SS_AUTODISARM, bypass on_sig_stack() Git-Commit-ID: c876eeab6432687846d4cd5fe1e43dbc348de134 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: c876eeab6432687846d4cd5fe1e43dbc348de134 Gitweb: http://git.kernel.org/tip/c876eeab6432687846d4cd5fe1e43dbc348de134 Author: Andy Lutomirski AuthorDate: Tue, 3 May 2016 10:31:49 -0700 Committer: Ingo Molnar CommitDate: Wed, 4 May 2016 08:34:13 +0200 signals/sigaltstack: If SS_AUTODISARM, bypass on_sig_stack() If a signal stack is set up with SS_AUTODISARM, then the kernel inherently avoids incorrectly resetting the signal stack if signals recurse: the signal stack will be reset on the first signal delivery. This means that we don't need check the stack pointer when delivering signals if SS_AUTODISARM is set. This will make segmented x86 programs more robust: currently there's a hole that could be triggered if ESP/RSP appears to point to the signal stack but actually doesn't due to a nonzero SS base. Signed-off-by: Andy Lutomirski Cc: Al Viro Cc: Aleksa Sarai Cc: Amanieu d'Antras Cc: Andrea Arcangeli Cc: Andrew Morton Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Brian Gerst Cc: Denys Vlasenko Cc: Eric W. Biederman Cc: Frederic Weisbecker Cc: H. Peter Anvin Cc: Heinrich Schuchardt Cc: Jason Low Cc: Josh Triplett Cc: Konstantin Khlebnikov Cc: Linus Torvalds Cc: Oleg Nesterov Cc: Palmer Dabbelt Cc: Paul Moore Cc: Pavel Emelyanov Cc: Peter Zijlstra Cc: Richard Weinberger Cc: Sasha Levin Cc: Shuah Khan Cc: Stas Sergeev Cc: Tejun Heo Cc: Thomas Gleixner Cc: Vladimir Davydov Cc: linux-api@vger.kernel.org Link: http://lkml.kernel.org/r/c46bee4654ca9e68c498462fd11746e2bd0d98c8.1462296606.git.luto@kernel.org Signed-off-by: Ingo Molnar --- include/linux/sched.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/linux/sched.h b/include/linux/sched.h index 2950c5c..77fd49f 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2576,6 +2576,18 @@ static inline int kill_cad_pid(int sig, int priv) */ static inline int on_sig_stack(unsigned long sp) { + /* + * If the signal stack is SS_AUTODISARM then, by construction, we + * can't be on the signal stack unless user code deliberately set + * SS_AUTODISARM when we were already on it. + * + * This improves reliability: if user state gets corrupted such that + * the stack pointer points very close to the end of the signal stack, + * then this check will enable the signal to be handled anyway. + */ + if (current->sas_ss_flags & SS_AUTODISARM) + return 0; + #ifdef CONFIG_STACK_GROWSUP return sp >= current->sas_ss_sp && sp - current->sas_ss_sp < current->sas_ss_size;