[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen/x86: don't corrupt %eip when returning from a signal handler



>>> On 17.10.12 at 14:19, David Vrabel <david.vrabel@xxxxxxxxxx> wrote:
> On 17/10/12 13:07, Jan Beulich wrote:
>>>>> On 17.10.12 at 13:42, David Vrabel <david.vrabel@xxxxxxxxxx> wrote:
>>> From: David Vrabel <david.vrabel@xxxxxxxxxx>
>>>
>>> In 32 bit guests, if a userspace process has %eax == -ERESTARTSYS
>>> (-512) or -ERESTARTNOINTR (-513) when it is interrupted by an event
>>> /and/ the process has a pending signal then %eip (and %eax) are
>>> corrupted when returning to the main process after handling the
>>> signal.  The application may then crash with SIGSEGV or a SIGILL or it
>>> may have subtly incorrect behaviour (depending on what instruction it
>>> returned to).
>>>
>>> The occurs because handle_signal() is incorrectly thinking that there
>>> is a system call that needs to restarted so it adjusts %eip and %eax
>>> to re-execute the system call instruction (even though user space had
>>> not done a system call).
>>>
>>> If %eax == -514 (-ERESTARTNOHAND (-514) or -ERESTART_RESTARTBLOCK
>>> (-516) then handle_signal() only corrupted %eax (by setting it to
>>> -EINTR).  This may cause the application to crash or have incorrect
>>> behaviour.
>>>
>>> handle_signal() assumes that regs->orig_ax >= 0 means a system call so
>>> any kernel entry point that is not for a system call must push a
>>> negative value for orig_ax.  For example, for physical interrupts on
>>> bare metal the inverse of the vector is pushed and page_fault() sets
>>> regs->orig_ax to -1, overwriting the hardware provided error code.
>>>
>>> xen_hypervisor_callback() was incorrectly pushing 0 for orig_ax
>>> instead of -1.  For consistency, we also change
>>> xen_failsafe_callback().
>> 
>> Is this really just for consistency? There is a way for the failsafe
>> callback to continue to ret_from_exception, and I would think that
>> the same situation could arise there (and for the x86-64 case too).
> 
> The 32-bit xen_failsafe_callback was using %eax for orig_ax which is
> safe (see comment on classic kernel behaviour below).

Ah, yes, I didn't spot that %eax was used there instead of 0
(and other than inn the classic Xen kernel, which I will want to
fix too).

> We couldn't repro the issue in 64-bit guests and looking at entry_64.S
> xen_hypervisor_callback is correct (see the zeroentry macro).

Yes, the normal callback path isn't affected there.

> I must admit to not really being able to follow what
> xen_failsafe_callback is doing, but it does look like that last pushq
> before the SAVE_ALL should be pushq_cfi $-1 as well.  Do you agree?

That's what I was trying to hint at. Feel free to put my ack on
the patch if you re-submit with that adjustment (and ideally the
commit message adjusted too).

Jan

>>> Classic Xen kernels pushed %eax which works as %eax cannot be both
>>> non-negative and -RESTARTSYS (etc.), but using -1 avoids the
>>> additional tests in handle_signal().
>>>
>>> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
>>> Cc: stable@xxxxxxxxxx 
>>> ---
>>>  arch/x86/kernel/entry_32.S |    4 ++--
>>>  1 files changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S
>>> index 2c63407..6a19e66 100644
>>> --- a/arch/x86/kernel/entry_32.S
>>> +++ b/arch/x86/kernel/entry_32.S
>>> @@ -1042,7 +1042,7 @@ ENTRY(xen_sysenter_target)
>>>  
>>>  ENTRY(xen_hypervisor_callback)
>>>     CFI_STARTPROC
>>> -   pushl_cfi $0
>>> +   pushl_cfi $-1 /* orig_ax = -1 => not a system call */
>>>     SAVE_ALL
>>>     TRACE_IRQS_OFF
>>>  
>>> @@ -1078,7 +1078,7 @@ ENDPROC(xen_hypervisor_callback)
>>>  # We distinguish between categories by maintaining a status value in EAX.
>>>  ENTRY(xen_failsafe_callback)
>>>     CFI_STARTPROC
>>> -   pushl_cfi %eax
>>> +   pushl_cfi $-1  /* orig_ax = -1 => not a system call */
>>>     movl $1,%eax
>>>  1: mov 4(%esp),%ds
>>>  2: mov 8(%esp),%es
>>> -- 
>>> 1.7.2.5
>>>
>>>
>>> _______________________________________________
>>> Xen-devel mailing list
>>> Xen-devel@xxxxxxxxxxxxx 
>>> http://lists.xen.org/xen-devel 
>> 
>> 
>> 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.