Messages in this thread | | | Date | Fri, 30 Jul 2021 13:22:37 +0100 | From | Will Deacon <> | Subject | Re: [PATCH] arm64: audit: fix return value high 32bit truncation problem |
| |
On Thu, Jul 22, 2021 at 02:07:07PM +0800, Yuchen Wei wrote: > From: weiyuchen <weiyuchen3@huawei.com> > > 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 <weiyuchen3@huawei.com> > --- > 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
| |