Skip to contentSkip to conversation

Fix sysenter (%ebp) fault handling

PATCH New Luca Barbieri 1 participant 1 message Jan 6, 2003

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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.

arch/i386/kernel/entry.S +10 -2
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
@@ -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
 .previous
 
 	pushl %eax
@@ -367,6 +373,14 @@ syscall_exit_work:
 	jmp resume_userspace
 
 	ALIGN
+syscall_fault:
+	pushl %eax			# save orig_eax
+	SAVE_ALL
+	GET_THREAD_INFO(%ebx)
+	movl $-EFAULT,EAX(%esp)
+	jmp resume_userspace
+
+	ALIGN
 syscall_badsys:
 	movl $-ENOSYS,EAX(%esp)
 	jmp resume_userspace