diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2010-09-14 12:42:41 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-03-21 12:44:12 -0700 |
commit | 86869f15548105de95cfbf51b240b37a8e1bf35d (patch) | |
tree | 97d725bf8663d095516b4f749797806bd4686fc7 /kernel/compat.c | |
parent | d4c7414aa43c3c71245d33bb976c92af727240f4 (diff) |
x86-64, compat: Test %rax for the syscall number, not %eax
commit 36d001c70d8a0144ac1d038f6876c484849a74de upstream.
On 64 bits, we always, by necessity, jump through the system call
table via %rax. For 32-bit system calls, in theory the system call
number is stored in %eax, and the code was testing %eax for a valid
system call number. At one point we loaded the stored value back from
the stack to enforce zero-extension, but that was removed in checkin
d4d67150165df8bf1cc05e532f6efca96f907cab. An actual 32-bit process
will not be able to introduce a non-zero-extended number, but it can
happen via ptrace.
Instead of re-introducing the zero-extension, test what we are
actually going to use, i.e. %rax. This only adds a handful of REX
prefixes to the code.
Reported-by: Ben Hawkes <hawkes@sota.gen.nz>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Cc: Roland McGrath <roland@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'kernel/compat.c')
0 files changed, 0 insertions, 0 deletions