Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd88ec23 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

x86: fix error handling for 32-bit compat out-of-range system call numbers



Commit 3f5159a9 ("x86/asm/entry/32: Update -ENOSYS handling to match
the 64-bit logic") broke the ENOSYS handling for the 32-bit compat case.
The proper error return value was never loaded into %rax, except if
things just happened to go through the audit paths, which ended up
reloading the return value.

This moves the loading or %rax into the normal system call path, just to
make sure the error case triggers it.  It's kind of sad, since it adds a
useless instruction to reload the register to the fast path, but it's
not like that single load from the stack is going to be noticeable.

Reported-by: default avatarDavid Drysdale <drysdale@google.com>
Tested-by: default avatarKees Cook <keescook@chromium.org>
Acked-by: default avatarAndy Lutomirski <luto@amacapital.net>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5b3e2e14
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -140,6 +140,7 @@ sysexit_from_sys_call:
	 */
	andl	$~TS_COMPAT, ASM_THREAD_INFO(TI_status, %rsp, SIZEOF_PTREGS)
	movl	RIP(%rsp), %ecx		/* User %eip */
	movq    RAX(%rsp), %rax
	RESTORE_RSI_RDI
	xorl	%edx, %edx		/* Do not leak kernel information */
	xorq	%r8, %r8
@@ -219,7 +220,6 @@ sysexit_from_sys_call:
1:	setbe	%al			/* 1 if error, 0 if not */
	movzbl	%al, %edi		/* zero-extend that into %edi */
	call	__audit_syscall_exit
	movq	RAX(%rsp), %rax		/* reload syscall return value */
	movl	$(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), %edi
	DISABLE_INTERRUPTS(CLBR_NONE)
	TRACE_IRQS_OFF
@@ -368,6 +368,7 @@ sysretl_from_sys_call:
	RESTORE_RSI_RDI_RDX
	movl	RIP(%rsp), %ecx
	movl	EFLAGS(%rsp), %r11d
	movq    RAX(%rsp), %rax
	xorq	%r10, %r10
	xorq	%r9, %r9
	xorq	%r8, %r8