Re: [PATCH] arm64: audit: fix return value high 32bit truncation problem
From: Will Deacon <will@kernel.org>
Date: 2021-07-30 12:22:45
Also in:
lkml
On Thu, Jul 22, 2021 at 02:07:07PM +0800, Yuchen Wei wrote:
quoted hunk ↗ jump to hunk
From: weiyuchen <redacted> Add error code judgment in invoke_syscall() to prevent kernel components such as audit and tracepoint from obtaining incorrect return values. For example: type=SYSCALL msg=audit(342.780:69): arch=40000028 syscall=235 success=yes exit=4294967235 The syscall return value is -61, but due to the following process in invoke_syscall(): if (is_compat_task()) ret = lower_32_bits(ret); regs->regs[0] = ret; The return value audit or tracepoint get from regs[0] is 4294967235, which is an incorrect return value. Signed-off-by: weiyuchen <redacted> --- arch/arm64/kernel/syscall.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c index 263d6c1a525f..f9f042d9a088 100644 --- a/arch/arm64/kernel/syscall.c +++ b/arch/arm64/kernel/syscall.c@@ -54,7 +54,7 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno, ret = do_ni_syscall(regs, scno); } - if (is_compat_task()) + if (is_compat_task() && !IS_ERR_VALUE(ret)) ret = lower_32_bits(ret);
Hmm, I'm worried this might break other users who don't expect to see non-zero bits for the upper 32-bits of a compat task. Mark -- I remember you looking into this relatively recently. Where did you get to with it? Will _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel