Skip to content

Commit

Permalink
arm64: compat: Ensure upper 32 bits of x0 are zero on syscall return
Browse files Browse the repository at this point in the history
Although we zero the upper bits of x0 on entry to the kernel from an
AArch32 task, we do not clear them on the exception return path and can
therefore expose 64-bit sign extended syscall return values to userspace
via interfaces such as the 'perf_regs' ABI, which deal exclusively with
64-bit registers.

Explicitly clear the upper 32 bits of x0 on return from a compat system
call.

Cc: <stable@vger.kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Keno Fischer <keno@juliacomputing.com>
Cc: Luis Machado <luis.machado@linaro.org>
Signed-off-by: Will Deacon <will@kernel.org>
  • Loading branch information
Will Deacon committed Jul 16, 2020
1 parent 3a5a436 commit 1595668
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
12 changes: 11 additions & 1 deletion arch/arm64/include/asm/syscall.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ static inline long syscall_get_error(struct task_struct *task,
struct pt_regs *regs)
{
unsigned long error = regs->regs[0];

if (is_compat_thread(task_thread_info(task)))
error = sign_extend64(error, 31);

return IS_ERR_VALUE(error) ? error : 0;
}

Expand All @@ -47,7 +51,13 @@ static inline void syscall_set_return_value(struct task_struct *task,
struct pt_regs *regs,
int error, long val)
{
regs->regs[0] = (long) error ? error : val;
if (error)
val = error;

if (is_compat_thread(task_thread_info(task)))
val = lower_32_bits(val);

regs->regs[0] = val;
}

#define SYSCALL_MAX_ARGS 6
Expand Down
3 changes: 3 additions & 0 deletions arch/arm64/kernel/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
ret = do_ni_syscall(regs, scno);
}

if (is_compat_task())
ret = lower_32_bits(ret);

regs->regs[0] = ret;
}

Expand Down

0 comments on commit 1595668

Please sign in to comment.