core/entry: Respect syscall number rewrites
authorThomas Gleixner <tglx@linutronix.de>
Wed, 19 Aug 2020 19:44:39 +0000 (21:44 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 21 Aug 2020 14:17:29 +0000 (16:17 +0200)
The transcript of the x86 entry code to the generic version failed to
reload the syscall number from ptregs after ptrace and seccomp have run,
which both can modify the syscall number in ptregs. It returns the original
syscall number instead which is obviously not the right thing to do.

Reload the syscall number to fix that.

Fixes: 142781e108b1 ("entry: Provide generic syscall entry functionality")
Reported-by: Kyle Huey <me@kylehuey.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Kyle Huey <me@kylehuey.com>
Tested-by: Kees Cook <keescook@chromium.org>
Acked-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/87blj6ifo8.fsf@nanos.tec.linutronix.de
kernel/entry/common.c

index 9852e0d62d95ccd572c4fa648ee6da1063afbedd..fcae019158cad4c63df4305aed1c6308b427b722 100644 (file)
@@ -65,7 +65,8 @@ static long syscall_trace_enter(struct pt_regs *regs, long syscall,
 
        syscall_enter_audit(regs, syscall);
 
-       return ret ? : syscall;
+       /* The above might have changed the syscall number */
+       return ret ? : syscall_get_nr(current, regs);
 }
 
 noinstr long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall)