Revision b645af2d5905c4e32399005b867987919cbfc3ae authored by Andy Lutomirski on 23 November 2014, 02:00:33 UTC, committed by Linus Torvalds on 23 November 2014, 21:56:19 UTC
It's possible for iretq to userspace to fail. This can happen because of a bad CS, SS, or RIP. Historically, we've handled it by fixing up an exception from iretq to land at bad_iret, which pretends that the failed iret frame was really the hardware part of #GP(0) from userspace. To make this work, there's an extra fixup to fudge the gs base into a usable state. This is suboptimal because it loses the original exception. It's also buggy because there's no guarantee that we were on the kernel stack to begin with. For example, if the failing iret happened on return from an NMI, then we'll end up executing general_protection on the NMI stack. This is bad for several reasons, the most immediate of which is that general_protection, as a non-paranoid idtentry, will try to deliver signals and/or schedule from the wrong stack. This patch throws out bad_iret entirely. As a replacement, it augments the existing swapgs fudge into a full-blown iret fixup, mostly written in C. It's should be clearer and more correct. Signed-off-by: Andy Lutomirski <luto@amacapital.net> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Cc: stable@vger.kernel.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 6f442be
File | Mode | Size |
---|---|---|
.gitignore | -rw-r--r-- | 151 bytes |
Kconfig | -rw-r--r-- | 3.0 KB |
Makefile | -rw-r--r-- | 2.3 KB |
gen_init_cpio.c | -rw-r--r-- | 12.7 KB |
initramfs_data.S | -rw-r--r-- | 1.3 KB |
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...