All of lore.kernel.org
 help / color / mirror / Atom feed
From: Suresh Siddha <suresh.b.siddha@intel.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>,
	"x86@kernel.org" <x86@kernel.org>,
	"andi@firstfloor.org" <andi@firstfloor.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	"stable@kernel.org" <stable@kernel.org>,
	Ingo Molnar <mingo@elte.hu>
Subject: Re: [patch] x64, fpu: fix possible FPU leakage in error conditions
Date: Thu, 24 Jul 2008 11:50:53 -0700	[thread overview]
Message-ID: <20080724185053.GJ14380@linux-os.sc.intel.com> (raw)
In-Reply-To: <alpine.LFD.1.10.0807241122260.3237@nehalem.linux-foundation.org>

On Thu, Jul 24, 2008 at 11:31:42AM -0700, Linus Torvalds wrote:
> 
> 
> On Thu, 24 Jul 2008, Suresh Siddha wrote:
> >
> > In the error condition for restore_fpu_checking() (especially during
> > the 64bit signal return), we are doing init_fpu(), which saves the live
> > FPU register state (possibly belonging to some other process context) into the
> > thread struct (through unlazy_fpu() in init_fpu()). This is wrong and can leak
> > the FPU data.
> >
> > Remove the unlazy_fpu() from the init_fpu(). init_fpu() will now always
> > init the FPU data in the thread struct. For the error conditions in
> > restore_fpu_checking(), restore the initialized FPU data from the thread
> > struct.
> 
> Why? The thread struct is guaranteed to contain pointless data.

init_fpu() will set it to sane init state, from where we can restore.

> If we cannot restore the FP state from the signal stack, we should not try
> to restore it from anywhere _else_ either, since nowhere else will have
> any better results.
> 
> I suspect we should just reset the x87 state (which was the _intention_ of
> the code), possibly by just doing "stts + used_math = 0". The signal
> handling code already checks for errors, and will force a SIGSEGV if this
> ever happens.

Yes, this was what I had in mind earlier and should be ok for signal handling
case. But as you also noted below:

> (Yes, there is also a restore_fpu_checking() in math_state_restore(), but
> that one _already_ uses &current->thread.xstate->fxsave as the buffer to
> restore from, so trying to do that _again_ when it fails seems to be
> really really wrong - we already _did_ that, and that was what failed to
> begin with)

We are doing init_fpu(), which should make the data sane again.

This is a paranoid case, just to make sure that the next
math_state_restore()  doesn't cause #GP, after someone sets illegal values
through ptrace() or 32bit signal handling (which modifies fpu state in thread
struct). I say paranoid, because we already do the necessary checks
in the corresponding locations like ptrace/32-bit signal handling.

If we don't do init_fpu() + restore from the sane init state, process has
to be killed, in the paranoid failing scenario of math_state_restore()

thanks,
suresh

  reply	other threads:[~2008-07-24 18:52 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-24 18:04 [patch] x64, fpu: fix possible FPU leakage in error conditions Suresh Siddha
2008-07-24 18:31 ` Linus Torvalds
2008-07-24 18:50   ` Suresh Siddha [this message]
2008-07-24 18:59     ` Linus Torvalds
2008-07-24 20:27       ` Suresh Siddha
2008-07-24 20:30         ` Linus Torvalds
2008-07-24 21:23           ` Suresh Siddha
2008-07-24 21:54             ` Linus Torvalds
2008-07-24 22:25               ` Suresh Siddha
2008-07-24 22:43                 ` Linus Torvalds
2008-07-24 23:02                   ` Suresh Siddha
2008-07-24 23:06                   ` Suresh Siddha
2008-07-24 23:16                     ` Linus Torvalds
2008-07-25  1:07                   ` Suresh Siddha
2008-07-26 14:37                     ` Ingo Molnar

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=20080724185053.GJ14380@linux-os.sc.intel.com \
    --to=suresh.b.siddha@intel.com \
    --cc=andi@firstfloor.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=x86@kernel.org \
    /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 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.