[lkml]   [2003]   [Jan]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Patch in this message
Subject[PATCH] Fix sysenter (%ebp) fault handling
Currently syscall_badsys is called to handle faults when reading the
sixth parameter in sysenter; however that routine assumes that
registers have already been pushed on the stack, and this is not the
case (in other words, it will currently try to pop beyond the end of
the thread stack).

This patch adds a new "function", syscall_fault, that saves register
and returns.

The return value is changed to EFAULT, which seems more appropriate
than ENOSYS.

diff --exclude-from=/home/ldb/src/exclude -urNdp --exclude='speedtouch.*' --exclude='atmsar.*' linux-2.5.54/arch/i386/kernel/entry.S linux-2.5.54-ldb/arch/i386/kernel/entry.S
--- linux-2.5.54/arch/i386/kernel/entry.S 2003-01-02 04:21:27.000000000 +0100
+++ linux-2.5.54-ldb/arch/i386/kernel/entry.S 2003-01-04 19:06:07.000000000 +0100
@@ -253,11 +253,11 @@ ENTRY(sysenter_entry)
* Careful about security.
cmpl $__PAGE_OFFSET-3,%ebp
- jae syscall_badsys
+ jae syscall_fault
1: movl (%ebp),%ebp
.section __ex_table,"a"
.align 4
- .long 1b,syscall_badsys
+ .long 1b,syscall_fault

pushl %eax
@@ -367,6 +373,14 @@ syscall_exit_work:
jmp resume_userspace

+ pushl %eax # save orig_eax
+ movl $-EFAULT,EAX(%esp)
+ jmp resume_userspace
movl $-ENOSYS,EAX(%esp)
jmp resume_userspace[unhandled content-type:application/pgp-signature]
 \ /
  Last update: 2005-03-22 13:32    [W:0.031 / U:8.760 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site