x86_64/vsyscall: Restore orig_ax after vsyscall seccomp
authorAndy Lutomirski <luto@amacapital.net>
Tue, 4 Nov 2014 23:36:50 +0000 (15:36 -0800)
committerIngo Molnar <mingo@kernel.org>
Mon, 10 Nov 2014 09:46:35 +0000 (10:46 +0100)
The vsyscall emulation code sets orig_ax for seccomp's benefit,
but it forgot to set it back.

I'm not sure that this is observable at all, but it could cause
confusion to various /proc or ptrace users, and it's possible
that it could cause minor artifacts if a signal were to be
delivered on return from vsyscall emulation.

Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/cdc6a564517a4df09235572ee5f530ccdcf933f7.1415144089.git.luto@amacapital.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/kernel/vsyscall_64.c

index 7d9eb4bc10ac70bf8e5157d20487a5ad622986c4..2dcc6ff6fdcc6371a65a83f2e9c5288c1726e513 100644 (file)
@@ -206,6 +206,7 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
                                  "seccomp tried to change syscall nr or ip");
                do_exit(SIGSYS);
        }
+       regs->orig_ax = -1;
        if (tmp)
                goto do_ret;  /* skip requested */