Skip to contentSkip to conversation

: Fix syscall return code when ptrace or audit is active

PATCH In review Chris Lalancette 2 participants 3 messages Jun 30, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 : Fix syscall return code when ptrace or audit is active

Attached is a simple patch to fix the return value from the 64-bit kernel when you call with a bad system call number with tracing enabled (for either ptrace or audit). What should happen is that the user process gets a -ENOSYS return call from the syscall; what actually happens (only in the 64-bit kernel) is that you get back the system call number. The 32-bit kernel does not suffer from this bug, and the pv-ops implementation in the upstream Linux kernel also does not have this bug. The attached patch makes the tracesys path look the same as it does in upstream Linux, and ensures that we return -ENOSYS on this path.

arch/x86_64/kernel/entry-xen.S +2 -3
diff -r b29a06ba7a5f arch/x86_64/kernel/entry-xen.S
@@ -334,12 +334,11 @@ tracesys:
 	LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
 	RESTORE_REST
 	cmpq $__NR_syscall_max,%rax
-	ja  1f
+	ja  int_ret_from_sys_call
 	movq %r10,%rcx	/* fixup for C */
 	call *sys_call_table(,%rax,8)
-1:	movq %rax,RAX-ARGOFFSET(%rsp)
+	movq %rax,RAX-ARGOFFSET(%rsp)
 	/* Use IRET because user could have changed frame */
-	jmp int_ret_from_sys_call
 	CFI_ENDPROC
 END(system_call)
 		

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#1 lore raw
Quoted 10 lines · Chris Lalancette

Attached is a simple patch to fix the return value from the 64-bit kernel when you call with a bad system call number with tracing enabled (for either ptrace or audit). What should happen is that the user process gets a -ENOSYS return call from the syscall; what actually happens (only in the 64-bit kernel) is that
you get back the system call number. The 32-bit kernel does not suffer from this bug, and the pv-ops implementation in the upstream Linux kernel also does not have this bug. The attached patch makes the tracesys path look the same as
it does in upstream Linux, and ensures that we return -ENOSYS on this path.

Thanks. The removal of 'jmp int_ret_from_sys_call' is not part of the bugfix, and also I think the code is clearer if we keep it. So I've applied all of this patch except the removal of that jmp.

-- Keir

#2 lore raw
Quoted 4 lines · Keir Fraser

Thanks. The removal of 'jmp int_ret_from_sys_call' is not part of the bugfix, and also I think the code is clearer if we keep it. So I've applied all of this patch except the removal of that jmp.

Oh yes, of course. Upstream is just letting it fall through. That's fine. Thanks!

Chris Lalancette